是否有可能,如果是,如何获得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
,但事实并非如此。
答案 0 :(得分:19)
datetime.fromtimestamp(ts)
将“自纪元以来的秒数”转换为代表当地时间的天真日期时间对象。在这种情况下,tzinfo
始终为None
。
本地时区过去可能有不同的UTC偏移量。在一些提供对历史时区数据库的访问的系统上,fromtimestamp()
可能会将其考虑在内。
获取fromtimestamp()
使用的UTC偏移量:
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)
答案 1 :(得分:17)
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>)