在Python中,我的印象是datetime.date
基本上只是datetime.datetime
的一个子集,具有更少的功能和更少的开销。我想永远不要再使用datetime.date
,理由如下:
这两种类型之间不再有转换!
datetime.date
对象始终是时区不知道的。如果您有时使用datetime.date
并且有时使用datetime.datetime
我多次遇到头痛,不小心比较datetime.date
个对象和datetime.datetime
个对象。始终只使用一种类型可以使比较更简单。
格式化datetime.date
和datetime.datetime
之间的差异应仅是格式化问题。将差异进一步深入到基础类中会给语言带来不必要的复杂性。
如果我在正确的轨道上,那么datetime.date
最终将在未来的Python版本中弃用,就像unicode
和long
一样。现在采用这个惯例使我领先于曲线。
在我看来,继续使用datetime.date
的唯一令人信服的理由是datetime.datetime
中涉及的额外内存和存储量很少。让我们说我不关心这个额外的开销。有没有其他非常令人信服的理由继续使用这门课程?我不想切换到这个惯例,然后后悔,因为我错过了一些重要的事情。
答案 0 :(得分:12)
它们代表不同的东西。
datetime
是特定时间点。
date
及时区间。那天不是00:00:00,而是整天。
这就是为什么你不能直接在它们之间进行转换的原因。这就是为什么你不能用datetime
代替date
。
(同一timedelta
类型用于两者的事实可能是该模块中的一个缺陷,已经讨论了几次,但我怀疑它将永远被纠正。)
答案 1 :(得分:9)
这是确切的关系:
>>> import datetime
>>> issubclass(datetime.datetime, datetime.date)
True
如果您不想使用date
,请不要这样做。有许多应用程序,其中datetime
的“少量额外内存和存储”是一个重要的负担,特别是当需要将大量date
存储在数据库中作为泡菜时(例如,在Zope安装中的ZODB中 - Zope Corp支付当时的PythonLabs团队来设计和实现datetime
模块以开始;-))并非巧合。
编辑 - date
“的意思是”
我想及时推回@ abamert的“A date
是间隔。当天不是00:00:00,而是整个天。“你当然可以自由地思考它,但没有这样的意图。我与主要模块设计师Guido van Rossum和Jim Fulton一起编写了几乎所有原始的datetime
模块(包括Python和C版本)。
Guido非常热衷于“天真”日期和时代的概念,这是日常和时代的日常“常识”概念,它完全忽略了极客所喜欢的所有乏味的微妙之处;-)(如历史时区 - 甚至日历 - 调整,以及没有实际使用的“闰秒”给天文学家除外。对他来说,知道日期意图意味着什么的最好方法是问一个12岁的孩子。他们的回答并不重要。如果他们认为date(2014, 1, 9)
意味着“整天”,那很好。如果他们想把它当作一天开始的午夜时分,那也没关系。在当天结束的午夜,或者午休时间的午夜时间,或者在不同的日子不同的时间,或者根本没有任何时间,这些区别都在你的头部到目前为止date
令人担忧。 date
不会鼓励或阻止其中任何一个。
现在一个极客可能会反对“但是如果我认为date(2014, 1, 9)
是正午,你认为date(2014, 1, 10)
是下午3点,减去它们会返回错误的答案!”。打哈欠。问一个12岁的孩子:很明显,对于天真的日期,差异恰好是1天(天真)。
这里没有任何暗示任何特定的人或应用程序“应该”发现有用的东西。许多应用程序做发现它很有用。如果你的不是其中之一,请不要使用它。
总而言之,我对datetime
的唯一重大遗憾是tzinfo
个对象在模糊的过渡时间内无法区分“标准”和“日光”时间。 Guido的节俭感受到冒犯(在我看来过于严重)因为C struct tm
“浪费了”整个int
(tm_isdst
)这一点信息只需消除歧义过渡时期。当大多数人睡着时,在“日光”和“标准”时间之间切换的大多数地理区域进行这些转换并非巧合,因此对于几乎所有实际目的而言,模糊性是不可见的(“你是什么意思,凌晨2点10分?是时钟第一次读取时间是上午2:10,或者是我们再次将时钟从凌晨3点恢复到凌晨2点后的第二次?“)。但是对于那些真正关心的人来说,没有那点生活仍然是一种皇家的痛苦: - (