为什么gmtime和utcnow的时间差为1小时?

1 投票
3 回答
2375 浏览
提问于 2025-04-18 15:14

如果我这样做:

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

它会输出:

0:59:59.618000

为什么utcnow()给我的本地时间偏移了4个小时,而gmtime()偏移了5个小时呢?

这输出了 -5,并且:

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

难道这一切不应该都是UTC时间吗?

3 个回答

0

来自这个来源

UTC是一种不受夏令时影响的时间标准,而且在过去也没有进行过配置更改。

测量和存储时间时,始终使用UTC。

如果你需要记录时间是在哪个地方测量的,应该单独存储这个信息。不要把当地时间和时区信息一起存储!

而GMtime则会考虑夏令时的调整。

4

在Python中,time.gmtime()datetime.utcnow()之间没有1小时的差别。它们都表示的是同一个时间,都是在UTC时区下的时间。time.gmtime()并不是表示Europe/London时区的时间。UTC时区没有夏令时的变化,UTC时区的时差始终是零。

你的代码是错的。除非你的本地时区是UTC,否则用time.mktime()配合time.gmtime()作为输入是错误的。你的本地时区不是UTC,这可以通过time.timezone != 0来证明。

难道这一切不应该都是UTC时间吗?

  • time.gmtime()返回的是UTC时间,格式是时间元组
  • datetime.utcnow()返回的是UTC时间,格式是一个简单的datetime对象
  • time.mktime()接受的是本地时间,并返回“自纪元以来的秒数”
  • datetime.fromtimestamp()接受“自纪元以来的秒数”,并返回本地时间,格式是一个简单的datetime对象

要比较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时差,可以查看如何在Python中获取计算机的UTC时差

3

格林威治标准时间(GMT)在一年中的某些时候会有夏令时的调整,而协调世界时(UTC)则没有这个调整。

撰写回答