datetime.datetime.fromtimestamp() 返回当地时间。来自documentation:
返回POSIX时间戳对应的本地日期时间,如time.time()返回。如果可选参数tz为None或未指定,则时间戳转换为平台的本地日期和时间,返回的日期时间对象是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 实例上存储和操作,并且在向用户显示信息时仅转换为特定时区。这简化了日期时间处理,因为它可以让您避免许多时区极端情况和问题,例如混合来自不同时区和时区的日期时间信息以及夏季和冬季时间的区别。