我对 python 的datetime
工作方式有误解。最近看到两行代码:
datetime.datetime.utcnow()
datetime.datetime.utcnow().replace(tzinfo=pytz.utc)
我实际上无法理解它们之间有什么区别?在哪些情况下,这两个对象的行为方式不同?我将不胜感激澄清这个问题。
第一个创建一个datetime
没有时区的天真对象,第二个附加一个时区对象,使该对象知道时区。
这两个对象都会根据 UTC 为您提供日期和时间。
引用datetime
模块文档:
感知对象对适用的算法和政治时间调整(例如时区和夏令时信息)有足够的了解,以相对于其他感知对象定位自身。感知对象用于表示不可解释的特定时刻[1]。
一个天真的对象不包含足够的信息来明确地定位自己相对于其他日期/时间对象。一个简单的对象是否表示协调世界时 (UTC)、当地时间或某个其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量取决于程序一样。朴素的对象很容易理解和使用,但代价是忽略了现实的某些方面。
朴素和有意识的对象不具有可比性,您也不能在朴素和有意识的日期时间对象之间执行日期时间算术。
对对象的许多操作在datetime.datetime
这两种类型之间有所不同;我建议您在文档中搜索“naive”。操作不同的地方是由于存在额外的时区信息;例如,.utctimetuple()
将返回相同的值,.timetuple()
但对于天真的对象强制关闭 DST,但对于有意识的对象,返回的元组表示 UTC 时间,无论附加到对象的时区是什么。
这用于将时区分配给日期时间对象。如果您不设置 tzinfo,您将无法使用设置时区datetime.astimezone