UTC 纪元到 Python 时区感知日期时间对象 [复制]

utc epoch to python timezone aware datetime object [duplicate]

提问人:Bubble3D 提问时间:8/13/2023 更新时间:8/14/2023 访问量:84

问:

我们将时间值存储在数据库中,作为 UTC 的 13 位 unix 纪元。 因此,当我获取这些值以在 python 中处理时,我需要它们对时区敏感。

例如,当我将纪元值转换为 datetime 时,它会给我一个 naïve(时区不敏感)datetime 对象。 之后,一旦尝试将其转换为其他原生时间格式,就会搞砸计算。(因为我的本地电脑不在UTC时区)

>>>from datetime import datetime
>>>dt = datetime.utcfromtimestamp(1691868688457/1000)
>>>dt.astimezone(pytz.timezone('America/Chicago'))

输出结果为:

datetime.datetime(2023, 8, 12, 9, 1, 28, 457000, tzinfo=<DstTzInfo 'America/Chicago' CDT-1 day, 19:00:00 DST>)

它应该是:

datetime.datetime(2023, 8, 12, 14, 31, 28, 457000, tzinfo=<DstTzInfo 'America/Chicago' CDT-1 day, 19:00:00 DST>)

有没有办法以时区敏感的方式读取纪元值?现在我只是以一种粗略的方式转换它,例如:


dt = datetime(year=dt.year, month=dt.month, day=dt.day,
             hour=dt.hour, minute=dt.minute, second=dt.second,
             microsecond=dt.microsecond, tzinfo=pytz.utc)
python-3.x 日期时间 python-datetime

评论

0赞 slothrop 8/13/2023
关于为什么不能给你你所期望的有用的背景:blog.ganssle.io/articles/2019/11/utcnow.html。另请注意文档中的警告:docs.python.org/3/library/...utcfromtimestamp
0赞 FObersteiner 8/13/2023
对于您的具体情况,请参阅此处

答:

2赞 sky 8/13/2023 #1

改用带有参数的 fromtimestamp 来获取感知对象:tzdatetime

返回 POSIX 时间戳对应的本地日期和时间,例如 time.time() 返回。如果可选参数 tz 为 None 或未指定,则时间戳将转换为平台的本地日期和时间,并且返回的 datetime 对象是幼稚的。

如果 tz 不是 None,则它必须是 tzinfo 子类的实例,并且时间戳将转换为 tz 的时区。

>>> from datetime import timezone
>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime
>>> dt = datetime.fromtimestamp(1691868688457/1000, timezone.utc)
>>> dt
datetime.datetime(2023, 8, 12, 19, 31, 28, 457000, tzinfo=datetime.timezone.utc)
>>> dt.astimezone(ZoneInfo("America/Chicago"))
datetime.datetime(2023, 8, 12, 14, 31, 28, 457000, tzinfo=zoneinfo.ZoneInfo(key='America/Chicago'))