我有以下代码:
import datetime
dt = 1546955400
print(datetime.datetime.fromtimestamp(dt))
当我在本地计算机上运行此代码时,我得到了正确的(预期的)时间
2019-01-08 15:50:00
。
但是我尝试在VM上运行完全相同的代码,结果是
2019-01-08 13:50:00
(两个小时之前)。为什么会发生这种情况,以及如何解决它,以便无论代码在哪里运行,我总是得到第一个?
答案 0 :(得分:0)
datetime.datetime.fromtimestamp()
返回本地时间。来自documentation:
返回与POSIX时间戳相对应的本地日期和时间,例如
time.time()
返回的日期和时间。如果未指定可选参数tz
None
,则时间戳将转换为平台的本地日期和时间,并且返回的datetime对象是天真的。
时间戳值是相对于UTC时区的1970年1月1日午夜the UNIX epoch value的偏移量,以秒为单位。本地时间是相对于UTC(本地时区)在系统范围内配置的偏移量。
如果您的VM产生意外结果,则需要配置操作系统的时区。
或者,忽略时区,仅处理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
,因此您的VM设置为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
实例,并且仅在向用户显示信息时才转换为特定时区。这样可以简化日期时间的处理,因为它可以避免许多时区的极端情况和问题,例如将来自不同时区和时区的日期时间信息与夏令时和冬令时区分开来。