37

是否有可能,如果是,如何获取用于将POSIX 时间戳(自纪元以来的秒数)转换为对象的时区(即 UTC 偏移量或datetime.timezone具有该偏移量的实例) ?datetime.datetime.fromtimestamp()datetime

datetime.datetime.fromtimestamp()将 POSIX 时间戳转换为天真的datetime对象(即没有tzinfo),但这样做是使用系统的语言环境将其调整为本地时区和当时有效的 UTC 偏移量。

例如,使用 UTC 时间 2008 年 12 月 27 日午夜的日期(自纪元以来的 40 * 356 * 86400 秒):

>>> datetime.datetime.fromtimestamp(40 * 356 * 86400)
datetime.datetime(2008, 12, 27, 1, 0)

该时间戳在凌晨 1 点转换为datetime对象(当时是在 CET/CEST 时区)。100 天后,结果如下:

>>> datetime.datetime.fromtimestamp((40 * 356 + 100) * 86400)
datetime.datetime(2009, 4, 6, 2, 0)

也就是凌晨 2 点。这是因为那时 DST 处于活动状态。

我预计这datetime.datetime.fromtimestamp()会设置tzinfo它在返回的datetime实例中使用的,但事实并非如此。

4

4 回答 4

31

datetime.fromtimestamp(ts)将“自纪元以来的秒数”转换为表示本地时间的简单日期时间对象。tzinfo总是None在这种情况下。

本地时区过去可能有不同的 UTC 偏移量。在某些提供对历史时区数据库的访问的系统上,fromtimestamp()可能会考虑到它。

要获取 UTC 使用的偏移量fromtimestamp()

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

另请参阅在 Python 中获取计算机的 UTC 偏移量

于 2015-01-13T09:01:25.500 回答
22

Python 文档

类方法 datetime.fromtimestamp( timestamp, tz=None)

返回 POSIX 时间戳对应的本地日期和时间,如time.time(). 如果可选参数tzNone指定或未指定,时间戳被转换为平台的本地日期和时间,并且返回的datetime对象是朴素的。

否则tz必须是类tzinfo子类的实例,并且时间戳转换为tz的时区。在这种情况下,结果等价于tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))

此描述与您的问题相关的关键部分是,当您不指定时区时,它不仅使用本地时区,而且结果是naive。你似乎希望它知道

这是 Python 的一个特殊区别,在 datetime 文档的最顶部进行了讨论。

如果您想要的datetime知道本地时区的,请尝试使用tzlocal库。它专注于那个特定的问题。另请参阅此问题

于 2013-09-15T21:25:34.923 回答
10

如果您知道要转换的时间戳的时区,只需在调用时将其发送fromtimestamp

>>> from datetime import datetime
>>> import pytz
>>>
>>> datetime.fromtimestamp(1562684265, pytz.timezone("Europe/Stockholm"))
datetime.datetime(2019, 7, 9, 16, 57, 45, tzinfo=<DstTzInfo 'Europe/Stockholm' CEST+2:00:00 DST>)
>>>
>>> datetime.fromtimestamp(1562684265, pytz.timezone("UTC"))
datetime.datetime(2019, 7, 9, 14, 57, 45, tzinfo=<UTC>)
于 2019-07-09T15:16:57.737 回答
3

使用time.gmtime您可以提取上一个答案中描述的时区:Get TZ information of the system in Python? .

>>> from __future__ import print_function
>>> from time import gmtime, strftime
>>> print(strftime("%z", gmtime()))
-0600

在 python-2.7 和 python-3.3 中为我的 CST 笔记本电脑打印 -06:00 您还可以使用 localtime() 来获取本地时间结构。

>>> from __future__ import print_function
>>> from time import localtime
>>> lt = localtime()
>>> print(lt.tm_zone)
"CDT"
>>> print(lt.tm_gmtoff/(60*60))
-5.0
>>> print(lt.tm_gmtoff/(60*60) - (1 if lt.tm_isdst == 1 else 0)) # Adjusted for DST
-6.0

希望这可以帮助

于 2013-09-15T13:16:31.170 回答