【问题标题】:fromtimestamp returns different resultsfromtimestamp 返回不同的结果
【发布时间】:2019-06-03 08:11:55
【问题描述】:

我有以下代码:

import datetime

dt = 1546955400
print(datetime.datetime.fromtimestamp(dt))

当我在本地机器上运行这段代码时,我得到了正确的(预期的)时间,即

2019-01-08 15:50:00

但是我尝试在虚拟机上运行完全相同的代码,结果是 2019-01-08 13:50:00(两小时前)。为什么会发生这种情况,我该如何解决它,以便无论代码在哪里运行,我都能得到第一个?

【问题讨论】:

  • 您看到的是基于该时间戳(13.50 UTC)的本地时间。

标签: python python-3.x datetime timestamp


【解决方案1】:

datetime.datetime.fromtimestamp() 返回当地时间。来自documentation

返回POSIX时间戳对应的本地日期时间,如time.time()返回。如果可选参数tzNone或未指定,则时间戳转换为平台的本地日期和时间,返回的日期时间对象是naive。

时间戳值是从 UTC 时区 1970 年 1 月 1 日午夜 the UNIX epoch value 开始的偏移量,以秒为单位。本地时间是系统范围内配置的与本地时区 UTC 的偏移量。

如果您的虚拟机产生意外结果,您需要配置操作系统的时区。

或者,忽略时区,只处理 UTC 时区的时间。对于时间戳,这意味着使用datetime.datetime.utcfromtimestamp() function

您的具体时间戳是 13:50 UTC:

>>> dt = 1546955400
>>> from datetime import datetime
>>> datetime.utcfromtimestamp(dt)
datetime.datetime(2019, 1, 8, 13, 50)
>>> print(_)
2019-01-08 13:50:00

因此您的虚拟机设置为 UTC 或 GMT 时区(后者当前为 UTC+0,直到切换到英国 daylight saving 时区 BST)。您的本地系统位于 UTC+2 timezone 中,前提是您在个人资料中声明的位置是 EEE, Easter European Time

另一种选择是通过传入tz 参数来创建时区感知时间戳。如果您有特定的 UTC 偏移量,只需为该偏移量创建一个 datetime.timezone() instance

utcplus2 = datetime.timezone(datetime.timedelta(hours=2))
datetime.datetime.fromtimestamp(dt, utcplus2)

但是,通常最好在世界各地的 UTC datetime 实例上存储和操作,并且在向用户显示信息时仅转换为特定时区。这简化了日期时间处理,因为它可以让您避免许多时区极端情况和问题,例如混合来自不同时区和时区的日期时间信息以及夏季和冬季时间的区别。

【讨论】:

  • 还有什么我可以使用的不依赖于当地时间的东西吗?
  • @ninesalt:是的,使用 UTC 时区,所以datetime.datetime.utcfromtimestamp()
  • 那您不是必须将结果偏移 2 小时才能到达 15:50 吗?
  • 您将在任何地方使用 UTC 时间戳。或者指定一个时区来转换时间。
  • 我会在任何地方使用 UTC,但是我正在抓取本地网站并存储时间/日期,所以我必须先将网站上的时间转换为 UTC。
猜你喜欢
  • 2011-09-28
  • 2019-01-18
  • 2012-11-30
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多