为什么gmtime和utcnow datetime之间有1小时的差异?

时间:2014-07-29 18:43:19

标签: python datetime

如果我这样做:

>>> print datetime.fromtimestamp(time.mktime(time.gmtime())) - datetime.utcnow()

打印:

0:59:59.618000

为什么utcnow()会在当地时间和gmtime()5小时内产生4小时的偏差?

这会打印-5和:

print int(-time.timezone/60/60)

这不是所有这些都应该是UTC时间吗?

3 个答案:

答案 0 :(得分:3)

GMtime有一个夏令时调整部分UTC没有。

答案 1 :(得分:2)

Python中time.gmtime()datetime.utcnow()之间没有1小时的差异。它们都代表 UTC 时区中的相同时间。 time.gmtime()并不代表Europe/London时区的时间。 UTC时区中没有DST转换。 UTC时区的utc偏移量始终为零。

你的代码错了。除非您的本地时区是UTC,否则使用time.mktime()time.gmtime()作为输入是不正确的。 time.timezone != 0见证了您当地的时区。

  

所有这些都不应该是UTC时间吗?

  • time.gmtime()将UTC时间作为时间元组返回
  • datetime.utcnow()将UTC时间作为天真的datetime对象
  • 返回
  • time.mktime()接受本地时间并返回自纪元以来的#34;秒#34;
  • datetime.fromtimestamp()接受"秒以来的时间"秒并将本地时间作为天真的日期时间对象
  • 返回

比较time.gmtime()datetime.utcnow()

#!/usr/bin/env python
import time
from datetime import datetime

print(abs(datetime(*time.gmtime()[:6]) - datetime.utcnow()))
# -> 0:00:00.524724

差异不为零,因为时间元组不存储微秒,否则无论您的本地时区如何,两个函数都会返回相同的时间。

如果您的目的是找到当地时区的utc偏移量,请参阅Getting computer's utc offset in Python

答案 2 :(得分:0)

来自source

  

UTC是一个没有夏令时但仍然是时区的时区   过去没有配置更改。

     

始终以UTC格式测量和存储时间。

     

如果您需要记录拍摄时间,请单独存储。   不要存储当地时间+时区信息!

而GMtime有夏令时调整