python - 为什么 `datetime` 模块对时区的行为如此?

标签 python datetime timezone

我正在尝试使用时间和时区。我位于美国/山区时区,并且我的计算机 (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/

相关文章:

python - scikit learn TSNE 转换应用于词向量时返回奇怪的结果

c# - 如果 DateTime 为 NULL,则无法获取 JSON 响应

python - 时间戳减法必须具有相同的时区或没有时区,但它们都是 UTC

c# - 在 WPF/C# 中显示时区。发现夏令时偏移

php - MySQL TIMESTAMP 列在更新时使用什么时区?

python - pyinstaller错误: OSError: Python library not found: libpython3. 4mu.so.1.0, libpython3.4m.so.1.0, libpython3.4.so.1.0

python - 矩阵 QR 分解算法

python - Selenium 使用 .find 方法返回空列表,即使有项目

python - 使用 pytz 的日期时间时区转换

python - 可以在Python的日期时间模块上仅指定年份吗?