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

Date/time conversion using time.mktime seems wrong

提问人:Daniel Benamy 提问时间:8/22/2008 最后编辑:user812786Daniel Benamy 更新时间:7/30/2017 访问量:5575

问:

>>> 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应返回自纪元以来的秒数。既然我给它一个时间在午夜,而纪元在午夜,那么结果不应该被一天中的秒数整除吗?

python 日期时间

评论

1赞 sparkes 8/22/2008
不确定这是否是您的问题,但要知道 time.mktime 调用 localtime,它咬了我一两次屁股。

答:

3赞 Anders Eurenius 8/22/2008 #1
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
0赞 Daren Thomas 8/22/2008 #2

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

>>> 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

这是你所期望的。我的猜测?也许自纪元以来已经进行了一些时间修正。这可能只有几秒钟,有点像闰年。我想我以前听说过这样的事情,但记不清具体是如何以及何时完成的......

8赞 Philip Reynolds 8/22/2008 #3

简短的回答:因为时区。

纪元采用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

看看 time.gmtime() 函数,它工作在 UTC 上。

2赞 Daniel Benamy 8/22/2008 #4

菲尔的回答确实解决了这个问题,但我会更详细地阐述一下。由于纪元是 UTC 格式,如果我想将其他时间与纪元进行比较,我还需要将它们解释为 UTC。

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

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

我可以用它来将日期转换为从纪元开始的天数表示,这就是我最终追求的。