Сведения о вопросе

SOON

13:42, 12th August, 2020

Теги

python   datetime    

Преобразование даты / времени с помощью time.mktime кажется неправильным

Просмотров: 473   Ответов: 4

>>> 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 должно возвращать количество секунд с момента начала эпохи. Поскольку я даю ему время в полночь, а эпоха-в полночь, разве результат не должен быть равномерно делим на количество секунд в день?



  Сведения об ответе

PAGE

00:47, 1st August, 2020

Короткий ответ: из-за часовых поясов.

Эпоха находится в UTC году.

Например, я нахожусь на IST (ирландское стандартное время) или UTC+1. time.mktime() относительно моего timezone, поэтому в моей системе это относится к

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

Поскольку вы получили результат 1233378000, это означает, что вы отстаете от меня на 5 часов

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

Взгляните на функцию time.gmtime(), которая работает с UTC.


  Сведения об ответе

prince

20:15, 19th August, 2020

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


  Сведения об ответе

prince

15:34, 13th August, 2020

Ответ Фила действительно решил эту проблему, но я расскажу немного подробнее. Поскольку эпоха находится в UTC году, если я хочу сравнить другие времена с эпохой, мне нужно интерпретировать их также как UTC.

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

При преобразовании временного кортежа в timestamp, который является UTC временем, я получаю число, которое равномерно делится на количество секунд в сутках.

Я могу использовать это для преобразования даты в представление days-from-the-epoch, которое в конечном счете является тем, что мне нужно.


  Сведения об ответе

lourence

22:05, 16th August, 2020

Интересный. Я не знаю, но я попробовал это сделать:

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

именно этого вы и ожидали. Мое предположение? Может быть, какая-то временная коррекция была сделана с той эпохи. Это может быть всего лишь несколько секунд, что-то вроде високосного года. Я думаю, что слышал нечто подобное раньше, но не могу точно вспомнить, как и когда это делается...


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться