可能,如果是,如何获取datetime.datetime.fromtimestamp()
用来将 POSIX 时间戳(自纪元以来的秒数)转换为datetime
对象的时区(即 UTC 偏移量或具有该偏移量的datetime.timezone
实例)?
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()
会设置它在返回的datetime
实例中使用的tzinfo
,但它没有。
>datetime.fromtimestamp(ts)
将"自纪元以来的秒数"转换为表示本地时间的朴素日期时间对象。 在这种情况下,tzinfo
总是None
。
过去,本地时区可能具有不同的 UTC 偏移量。在某些提供对历史时区数据库的访问的系统上,fromtimestamp()
可能会考虑这一点。
要获取fromtimestamp()
使用的 UTC 偏移量,请执行以下操作:
utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)
另请参阅在 Python 中获取计算机的 utc 偏移量。
来自 Python 文档:
类方法
datetime
.fromtimestamp
(timestamp, tz=None
)返回 POSIX 时间戳对应的本地日期和时间,如 由
time.time()
返回。如果可选参数 tzNone
或未指定,时间戳将转换为平台的本地日期和时间,并且返回的datetime
对象是朴素的。否则 tz 必须是类
tzinfo
子类的实例,并且时间戳将转换为 tz 的时区。在这种情况下,结果等效于tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz))
。
与您的问题相关的此描述的关键部分是,当您不指定时区时,它不仅使用本地时区,而且结果很幼稚。 你似乎希望它知道。
这是 Python 的一个特殊区别,在日期时间文档的最顶部进行了讨论。
如果您想要的是知道本地时区的datetime
,请尝试 tzlocal 库。 它侧重于这一特定问题。 另请参阅此问题。
如果您知道要转换的时间戳的时区,则可以在调用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>)
使用time.gmtime
可以按照前面的答案中提取时区:在 Python 中获取系统的 TZ 信息?。
>>> from __future__ import print_function
>>> from time import gmtime, strftime
>>> print(strftime("%z", gmtime()))
-0600
为我的 CST 笔记本电脑打印 -06:00 的 python-2.7 和 python-3.3你也可以使用 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
希望这有帮助