使用time.mktime的日期/时间转换似乎是错误的

时间:2008-08-22 09:06:44

标签: python datetime

>>> import time
>>> time.strptime("01-31-2009", "%m-%d-%Y")
(2009, 1, 31, 0, 0, 0, 5, 31, -1)
>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233378000.0
>>> 60*60*24 # seconds in a day
86400
>>> 1233378000.0 / 86400
14275.208333333334

time.mktime应该返回自纪元以来的秒数。因为我在午夜给它一个时间而且这个时期在午夜,所以结果不应该被一天中的秒数整除吗?

4 个答案:

答案 0 :(得分:7)

简短回答:因为时区。

Epoch是UTC。

例如,我在IST(爱尔兰标准时间)或UTC + 1。 time.mktime()与我的时区相关,所以在我的系统中,这指的是

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233360000.0

因为你得到的结果是1233378000,这表明你已经落后我5个小时了

>>> (1233378000 - 1233360000) / (60*60)    
5

查看有效的UTC time.gmtime()功能。

答案 1 :(得分:3)

mktime(...)
    mktime(tuple) -> floating point number

    Convert a time tuple in local time to seconds since the Epoch.
当地时间......想象一下。

时间元组:

The other representation is a tuple of 9 integers giving local time.
The tuple items are:
  year (four digits, e.g. 1998)
  month (1-12)
  day (1-31)
  hours (0-23)
  minutes (0-59)
  seconds (0-59)
  weekday (0-6, Monday is 0)
  Julian day (day in the year, 1-366)
  DST (Daylight Savings Time) flag (-1, 0 or 1)
If the DST flag is 0, the time is given in the regular time zone;
if it is 1, the time is given in the DST time zone;
if it is -1, mktime() should guess based on the date and time.

顺便说一下,我们似乎相距6个小时:

>>> time.mktime((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233356400.0
>>> (1233378000.0 - 1233356400)/(60*60)
6.0

答案 2 :(得分:2)

菲尔的答案真的解决了它,但我会详细说明一下。由于纪元是UTC,如果我想比较其他时间的纪元,我也需要将它们解释为UTC。

>>> calendar.timegm((2009, 1, 31, 0, 0, 0, 5, 31, -1))
1233360000
>>> 1233360000 / (60*60*24)
14275

通过将时间元组转换为时间戳处理为UTC时间,我得到一个 的数字,可以被一天中的秒数整除。

我可以用这个来将日期转换为日历代表,这是我最终追求的。

答案 3 :(得分:0)

有趣。我不知道,但我确实尝试过这个:

>>> now = time.mktime((2008, 8, 22, 11 ,17, -1, -1, -1, -1))
>>> tomorrow = time.mktime((2008, 8, 23, 11 ,17, -1, -1, -1, -1))
>>> tomorrow - now
86400.0

这是你所期望的。我猜?也许从时代开始就进行了一些时间的修正。这可能只有几秒钟,就像闰年。我想我之前听过这样的话,但是不记得到底是怎么做的......