首页 > 解决方案 > 如何打印 UTC UNIX 纪元/时间戳?

问题描述

当我打印 unix 纪元时,time.time()似乎在我的本地时区打印时间戳。特别是从转换器喜欢的东西:https ://www.epochconverter.com告诉我。

有谁知道我如何打印 UNIX 纪元/时间戳,但实际上是 UTC 时间?太感谢了。

标签: python

解决方案


没有“UTC UNIX 纪元时间”之类的东西。有 UNIX 纪元时间,周期。全世界都一样。它与时区无关。只要您计算机的时钟设置正确,time.time()就会给您正确的 UNIX 纪元时间。datetime.datetime.now().timestamp()会给你相同的 UNIX 纪元时间。你不需要转换任何东西,也没有什么可以转换的。

现在,解决Deepak 的评论,我认为这很重要:

对于与我的当地时间与 UTC 相对应的datetime.now()vs ,我确实得到了不同的响应。datetime.utcnow()因此,经过的秒数对我来说相差 19800 秒(我的时区 +5:30)。

这是一个已知的陷阱,datetime.utcnow实际上已在手册中解决

警告:由于许多方法将原始datetime对象视为datetime本地时间,因此最好使用感知日期时间来表示 UTC 时间。因此,创建表示当前 UTC 时间的对象的推荐方法是调用datetime.now(timezone.utc).

解压一下:

当您调用 时datetime.now(),它会为您返回当前本地时间的原始对象(意味着它没有附加时区 datetimetzinfo

>>> datetime.now()
datetime.datetime(2021, 4, 16, 9, 50, 3, 571235)

时间代表我当前的挂钟时间,但它不知道它在哪个时区。所以这个时间戳实际上可以代表这个星球上大约两打不同的绝对时间戳,这取决于你把它当作什么时区。

当使用此对象的timestamp()方法将其转换为绝对UNIX 时间戳时,必须假定某个时区。Python 将假定您计算机的本地时区进行转换。这很好datetime.now(),因为这个时间戳是用我的当地时间创建的:

>>> datetime.now().timestamp()
1618559403.571235

这是撰写本文时正确的 UNIX 时间戳。不是“我的本地时区”,而是全球。在撰写本文时,它1618559403遍布世界各地。

现在,如果您使用datetime.utcnow(),它将为您提供当前 UTC 时间的原始时间戳:

>>> datetime.utcnow()
datetime.datetime(2021, 4, 16, 7, 50, 3, 571235)

请注意它是如何从上一个 2 小时关闭的datetime.now(),这很好,因为这是 UTC 时区中的当前本地时间。但是由于这个时间戳仍然很幼稚,所以在将其转换为 UNIX 时间戳时,Python 必须假设某个时区,并且会假设我的本地时区。所以它给了我当地时间7:50:03 的 UNIX 时间戳:

>>> datetime.utcnow().timestamp()
1618552203.571235

这不是当前的 UNIX 时间。两个小时就关了 这是两小时前的 UNIX 时间。

如果我们正确地做到这一点,通过创建一个感知时间戳并获取它的 UNIX 时间,我们将得到正确的 UNIX 时间:

>>> datetime.now(timezone.utc)
datetime.datetime(2021, 4, 16, 7, 50, 3, 571235, tzinfo=datetime.timezone.utc)
>>> datetime.now(timezone.utc).timestamp()
1618559403.571235

请注意人类可读的时间与我们得到的相同datetime.utcnow(),但 UNIX 时间戳正确地是我们得到的那个datetime.now().timestamp()。这也与我们得到的相同time.time()

>>> from time import time
>>> time()
1618559403.571235

将其粘贴到您引用的https://www.epochconverter.com中时:

GMT:2021 年 4 月 16 日星期五 07:50:03.571
您的时区:2021 年 4 月 16 日星期五 09:50:03.571 GMT+02:00 DST

哪个是对的。在 UTC/GMT 中,此 UNIX 时间戳表示上午 7:50,而在我的本地时区中是上午 9:50。

如果我们采用不正确的 naïve datetime.utcnow()timestamp 1618552203.571235,结果是:

GMT:2021 年 4 月 16 日星期五 05:50:03.571
您的时区:2021 年 4 月 16 日星期五 07:50:03.571 GMT+02:00 DST

这是不正确的。那是2小时前,不是现在。


推荐阅读