python';时间力学

python';时间力学,python,datetime,Python,Datetime,我对python的datetime的工作原理有误解。最近我看到了两行代码: datetime.datetime.utcnow() datetime.datetime.utcnow().replace(tzinfo=pytz.utc) 我真的不明白他们之间有什么区别?在哪些情况下,这两个对象的行为方式不同?如果能澄清这个问题,我将不胜感激。第一个创建了一个没有时区的朴素的datetime对象,第二个附加了一个时区对象,使该对象能够感知时区 这两个对象都将根据UTC为您提供日期和时间 引述: 感知

我对python的
datetime
的工作原理有误解。最近我看到了两行代码:

datetime.datetime.utcnow()
datetime.datetime.utcnow().replace(tzinfo=pytz.utc)

我真的不明白他们之间有什么区别?在哪些情况下,这两个对象的行为方式不同?如果能澄清这个问题,我将不胜感激。

第一个创建了一个没有时区的朴素的
datetime
对象,第二个附加了一个时区对象,使该对象能够感知时区

这两个对象都将根据UTC为您提供日期和时间

引述:

感知对象对适用的算法和政治时间调整(如时区和夏令时信息)有足够的了解,以相对于其他感知对象定位自身。感知对象用于表示不可解释的特定时间点

原始对象包含的信息不足,无法相对于其他日期/时间对象明确定位自身。一个简单的对象是否表示协调世界时(UTC)、本地时间或其他时区的时间完全取决于程序,就像特定数字是否表示米、英里或质量取决于程序一样。天真的对象很容易理解和使用,但代价是忽略了现实的某些方面

Naive和aware对象不可比较,也不能在Naive和aware datetime对象之间执行datetime算法


datetime.datetime
对象的许多操作在这两种类型之间有所不同;我建议您在文档中搜索“naive”。如果操作不同,则是由于存在额外的时区信息;例如,
.utctimetuple()
将返回与
.timetuple()
相同的值,但对于原始对象强制关闭DST,但对于感知对象,返回的元组表示UTC时间,无论附加到对象的时区是什么。

这用于为日期时间对象分配时区。如果不设置tzinfo,则无法使用
datetime.astimezone


另请参阅:

这是否意味着我可以比较“感知”对象和“天真”对象?你能给我举个例子吗,我怎么会因为天真的datetime而惹上麻烦?你无法比较它们。您必须使用
.replace(tzinfo=None)
将aware对象转换为naive对象。任何需要了解时区的算法都会带来麻烦;例如,夏季和冬季。