python timestamp date_关于python:获取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秒):

>>> 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)

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

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

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

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

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

utc_offset = fromtimestamp(ts) - utcfromtimestamp(ts)

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

当我问这个问题的时候,这实际上是我需要的。知道时区规则并不重要,只是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库。它集中在那个特定的问题上。另请参见此问题。

是的,我想要一个已知的datetime对象,但是我正在寻找一种不使用任何附加库的方法,因为python显然已经能够访问必要的逻辑来计算与posix时间戳的正确偏移量。

实际上它本身并没有。它依赖于主机环境来提供翻译。因为这是平台特定的,并且不同的平台具有不同的TZ数据库实现,所以它不能将转换规则复制回TZINFO对象。

我知道情况是这样的。但通过C库,它可以访问逻辑,该逻辑可以使用操作系统的设置将UTC偏移量分配给POSIX时间戳(否则问题中的代码将无法工作)。

确切地。它只是无法将该逻辑复制回TZINFO Python对象,因此它无法将其表示为一个感知的日期时间。这就是TZLocal库试图猜测时区规则的原因。它询问操作系统,然后将自己的值赋回TZINFO。没有任何内置功能可以做到这一点。

@feuermurmel:.tm_zone,.tm_gmtoff在所有平台上都不可用。对于某些时区,time.tzname可能会失败。查看我答案中的最后一个链接。TZLocal返回PYTZ时区,这是跨平台解决方案的最佳选择。此外,不同版本的TZ数据库可能为同一时区提供不同的定义——安装纯python-pytz模块允许您控制使用的版本。

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

>>> 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()获取本地时间结构。

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

希望这有帮助

您不喜欢某个特定的答案(您可以通过单击某个答案下面的"共享"并复制URL来实现),这是什么意思?

你可能是说time.gmtime。在python 3.3中,它打印time.struct_time(tm_year=2008, tm_mon=12, tm_mday=27, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=5, tm_yday=362, tm_isdst=0)。我看不到时区信息。

哦,你可能是说time.gmtime().tm_gmtoff!它不起作用。它在设置为CEST的系统上返回0。

更改了链接和固定类型,谢谢。

两个注意事项:您的第一个示例是否应该打印+0000,因为gmtimes()的文档说明返回的struct_time是在UTC中?到目前为止,lt.tm_gmtoff似乎是我找到的唯一方法,但这意味着localtime()必须被调用两次(一次由datetime.fromtimestamp()调用),才能创建一个有意识的datetime实例。

strftime("%z")打印本地时区的当前UTC偏移量,无论参数是什么,即gmtime()与此无关。

同时,40 * 356 * 86400时间戳处的UTC偏移量可能与当前的UTC偏移量不同。andtm_gmtoff并非所有系统都可用,请参阅我的答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值