Python - calendar.timegm()与time.mktime()

ibz*_*ibz 57 python timezone

我似乎很难理解这一点.

calendar.timegm()和之间有什么区别time.mktime()

假设我datetime.datetime没有连接tzinfo,两个不应该给出相同的输出吗?难道他们都没有给出纪元和作为参数传递的日期之间的秒数?而且由于传递的日期没有tzinfo,那个秒数不一样吗?

>>> import calendar
>>> import time
>>> import datetime
>>> d = datetime.datetime(2010, 10, 10)
>>> calendar.timegm(d.timetuple())
1286668800
>>> time.mktime(d.timetuple())
1286640000.0
>>> 
Run Code Online (Sandbox Code Playgroud)

sth*_*sth 97

time.mktime()假设传递的元组是在本地时间,calendar.timegm()假设它是GMT/UTC.根据解释,元组表示不同的时间,因此函数返回不同的值(自纪元以UTC为基础的秒数).

值之间的差异应等于本地时区的时区偏移量.

  • @ibz:给`mktime()`的`timetuple`参数不包含任何时区信息(它永远不会,`timetuple`中没有时区字段).因此,函数必须"猜测"它可能是哪个时区,而`mktime()`总是假设它是本地时间.这就是函数的行为方式. (2认同)
  • 而且`calendar.timegm()`的纪元已硬编码为1970-01-01UTC(posix纪元)。`time.mktime()`*可能*使用不同的纪元。来自[docs:*对于Unix,纪元是1970年。要了解什么是纪元,请查看gmtime(0)。*](http://docs.python.org/3/library/time) stdlib的其余部分可能假定为posix纪元。 (2认同)

Sil*_*ost 9

calendar.timegm从UTC时间戳time.mktime转换,从本地时间转换而不是UTC.

8小时的结果差异与您所在位置的时区完全一致.

  • 更准确地说,timegm将给定日期解释为UTC,返回时间戳,而mktime将给定日期解释为本地时间,返回时间戳. (4认同)