繁体   English   中英

如何打印 UTC UNIX 纪元/时间戳?

[英]How to print the UTC UNIX Epoch/timestamp?

当我打印 unix 纪元时,使用time.time()之类的东西,它似乎打印了我当地时区的时间戳。 特别是来自转换器的喜欢: https://www.epochconverter.com告诉我。

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

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

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

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

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

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

解压一下:

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

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

请注意它与前一个datetime.now() 2 小时,这很好,因为这是 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中时,您可以参考:

格林威治标准时间: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()时间戳1618552203.571235 ,结果是:

格林威治标准时间:2021 年 4 月 16 日星期五 05:50:03.571
您的时区:2021 年 4 月 16 日星期五 07:50:03.571 GMT+02:00 DST

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM