Python 我可以完全停止使用datetime.date吗?
在Python中,我的印象是,Python 我可以完全停止使用datetime.date吗?,python,date,datetime,Python,Date,Datetime,在Python中,我的印象是,datetime.date基本上只是datetime.datetime的一个子集,具有较少的特性和略小的开销。我不想再使用datetime.date,原因如下: 这两种类型之间不再进行转换 datetime.date对象总是不知道时区,原因很明显。如果有时使用datetime.date,有时使用datetime.datetime 在很多情况下,我都会遇到比较datetime.date对象和datetime.datetime对象的麻烦。始终只使用一种类型可以简化比较
datetime.date
基本上只是datetime.datetime
的一个子集,具有较少的特性和略小的开销。我不想再使用datetime.date
,原因如下:
- 这两种类型之间不再进行转换
对象总是不知道时区,原因很明显。如果有时使用datetime.date
,有时使用datetime.date
datetime.datetime
- 在很多情况下,我都会遇到比较
对象和datetime.date
对象的麻烦。始终只使用一种类型可以简化比较datetime.datetime
和datetime.date
之间的格式差异应该只是格式问题。将差异进一步深入到底层类中会给语言带来不必要的复杂性datetime.datetime
- 如果我在这方面做得对,那么在Python的未来版本中,
最终将被弃用,就像datetime.date
和unicode
一样。现在采用这种惯例使我走在了前面long
在我看来,继续使用
datetime.date
唯一令人信服的理由是datetime.datetime
中涉及的少量额外内存和存储。假设我不在乎额外的开销。还有其他非常令人信服的理由继续使用这个类吗?我不想改用这个惯例,但后来又后悔,因为我错过了一些重要的事情。它们代表不同的东西
日期时间是一个特定的时间点
日期是一个时间间隔。那天不是00:00:00,而是一整天
这就是为什么不能在它们之间直接转换。这就是为什么不能用datetime
代替date
(两者使用相同的
timedelta
类型这一事实可能是模块中的一个缺陷,已经讨论了几次,但我怀疑它是否会得到纠正。)这是精确的关系:
>>> import datetime
>>> issubclass(datetime.datetime, datetime.date)
True
如果您不想使用日期
,请不要使用。在许多应用程序中,datetime
的“少量额外内存和存储”是一个巨大的负担,特别是当大量的date
需要作为pickle存储在数据库中时(例如,在Zope安装的ZODB中——Zope Corp付钱给当时的PythonLabs团队设计和实现datetime
模块并不是巧合;-)
编辑-日期的含义是“
我想把@abamert的“adate
是一个时间间隔。那天不是00:00:00,而是一整天。”你当然可以这样想,但没有这样的意图。我与主要模块设计者Guido van Rossum和Jim Fulton合作,编写了几乎所有原始的datetime
模块(Python和C版本)
Guido非常热衷于“天真”的日期和时间概念,这是一种日常“常识”的日期和时间概念,它忽略了极客们喜欢纠缠的所有繁琐微妙之处;-)(就像历史时区——甚至日历——的调整,以及“闰秒”对任何人都没有实际意义,除了天文学家)。对他来说,要知道约会的意思,最好的办法就是问一个12岁的孩子。他们的答案并不重要。如果他们认为日期(2014年1月9日)意味着“一整天”,那就好了。如果他们喜欢把它想象成一天开始时午夜的钟声,也可以。一天结束时的午夜,或中午,或下午3点的午睡时间,或不同日子的不同时间,或根本没有时间。。。就日期而言,这些区别都在你的脑海中<代码>日期不会鼓励或阻止任何人
现在,一个极客可能会反对“但是如果我把date(2014,1,9)
看作是中午,而你把date(2014,1,10)
看作是下午3点,减去它们就会返回一个错误的答案!”。打哈欠。问一个12岁的孩子:很明显,对于天真的约会来说,差别正好是1天
这里没有任何东西表明任何特定的人或应用程序“应该”认为这是有用的。许多应用程序确实发现它很有用。如果你的不是其中之一,不要使用它
总之,我对
datetime
唯一的遗憾是tzinfo
对象在模糊的过渡时间内没有可靠的方法来区分“标准”时间和“日光”时间。Guido的节俭感被冒犯了(在我看来,这太过分了),因为Cstruct tm
“浪费”了整个int
(tm_isdst
)只需要这1位信息就可以消除转换时间的歧义。大多数在“白天”和“标准”时间之间转换的地理区域在大多数人睡觉的时候进行这些转换,这不是巧合,因此几乎所有的实际目的都是看不到模糊性的(“凌晨2点10分是什么意思?这是时钟第一次显示凌晨2点10分,还是我们将时钟从凌晨3点拨回凌晨2点后的第二次?”)。但对于那些真正在乎的少数人来说,没有这一点的生活仍然是一种巨大的痛苦:-(我想说…atimedelta
是一个时间间隔。我写了一个很长的答案,但基本上是这样。日期不是日期时间。想想生日,它没有时间组件,所以添加一个时间组件会使管理带有datetime
的生日对象比j更困难