关于python:获取datetime.datetime.fromtimestamp()使用的时区

Get timezone used by datetime.datetime.fromtimestamp()

有没有可能,如果有,如何获得由datetime.datetime.fromtimestamp()用来将posix时间戳(从epoch开始的秒数)转换为datetime对象的时区(即UTC偏移量或具有该偏移量的datetime.timezone实例)?

datetime.datetime.fromtimestamp()将posix时间戳转换为幼稚的datetime对象(即没有tzinfo对象),但使用系统的区域设置将其调整为本地时区和当时有效的UTC偏移量。

例如,使用日期2008-12-27午夜UTC(自纪元起40*356*86400秒):

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

这个时间戳在早上1点被转换成一个datetime对象(当时它在CET/CEST时区中)。100天后,结果是:

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

早上两点。这是因为到那时,DST处于活动状态。

我原以为datetime.datetime.fromtimestamp()会设置它在返回的datetime实例中使用的tzinfo,但它没有。


datetime.fromtimestamp(ts)将"从纪元开始的秒数"转换为表示本地时间的简单日期时间对象。在这种情况下,tzinfo总是None

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

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

1
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

另请参见,获取计算机在python中的UTC偏移量。


从python文档中:

classmethod datetime.fromtimestamp(timestamp, tz=None)

Return the local date and time corresponding to the POSIX timestamp, such as is returned by time.time(). If optional argument tz is None or not specified, the timestamp is converted to the platform’s local date and time, and the returned datetime object is naive.

Else tz must be an instance of a class tzinfo subclass, and the timestamp is converted to tz‘s time zone. In this case the result is equivalent to tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)).

与您的问题相关的这个描述的关键部分是,当您不指定时区时,它不仅使用本地时区,而且结果是幼稚的。你似乎想让它意识到。

这是python所做的一个特别的区别,在datetime文档的最上面就已经讨论过了。

如果您想要的是一个了解本地时区的datetime,请尝试TZLocal库。它集中在那个特定的问题上。另请参见此问题。


使用time.gmtime可以提取时区,如前面的回答所述:用python获取系统的TZ信息?.

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

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

1
2
3
4
5
6
7
8
9
>>> 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

希望这有帮助