我正在尝试使用时间和时区。我位于美国/山区
时区,并且我的计算机 (Windows) 配置为该时区。
import datetime
import zoneinfo
utc = zoneinfo.ZoneInfo('UTC')
mt = zoneinfo.ZoneInfo('US/Mountain')
print(datetime.datetime.now())
print(datetime.datetime.now().astimezone(mt))
print(datetime.datetime.now().astimezone(utc))
# 2023-10-27 13:17:18.840857
# 2023-10-27 13:17:18.840857-06:00
# 2023-10-27 19:17:18.840857+00:00
最后一行让我感到困惑。我认为代码 datetime.datetime.now()
创建一个时区幼稚对象,然后 astimezone(utc)
将其转换为时区感知对象,但不会更改时间的“值(value)”。但在这里您可以看到 astimezone(utc)
导致时间值添加 6 小时,就像 datetime.datetime.now()
生成的时间一样是一个山地时间对象。
最佳答案
答案不在于 .now()
所做的事情,实际上,返回一个没有 tzinfo
的幼稚时区,而在于 .astimezone
当提供的日期很幼稚时会这样做。
.astimezone
方法将查找您的本地(您计算机的时区)并将其用于简单的日期时间。
mytz = self.tzinfo
if mytz is None:
mytz = self._local_timezone()
myoffset = mytz.utcoffset(self)
Link to current code in GitHub
因此,它的行为(有点/有点/很多但是)就好像您提供了本地化到计算机配置的时区的日期时间。
关于python - 为什么 `datetime` 模块对时区的行为如此?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77376677/