获取datetime.datetime.fromtimestamp()使用的时区

时间:2013-09-15 12:57:10

标签: python timezone

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

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

例如,使用日期2008-12-27午夜UTC(自纪元以来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 个答案:

答案 0 :(得分:19)

datetime.fromtimestamp(ts)将“自纪元以来的秒数”转换为代表当地时间的天真日期时间对象。在这种情况下,tzinfo始终为None

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

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

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

另见Getting computer's utc offset in Python

答案 1 :(得分:17)

来自Python documentation

  

classmethod datetime .fromtimestamp timestamp, tz=None

     

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

     

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

此说明中与您的问题相关的关键部分是,当您未指定时区时,它不仅使用本地时区,而且结果为 天真 即可。您似乎希望 意识到

这是Python的特殊区别,在the datetime documentation的最顶部进行了讨论。

如果您想要的是datetime 感知当地时区,请尝试使用tzlocal库。它专注于该特定问题。另请参阅this question

答案 2 :(得分:2)

使用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

希望这有帮助

答案 3 :(得分:0)

如果您知道要转换的时间戳的时区,则只需在致电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>)