2012-05-14 2 views
4

У меня есть код для преобразования некоторых временных меток, хранящихся в виде строк в объекты datetime, и заметил сегодня исключения, когда он преобразует даты со значением временной метки времени, превышающим максимальное значение int.Преобразование временных меток, больших, чем maxint, в объекты datetime

datetime.datetime.fromtimestamp(2147570047) 

, например, дает мне

ValueError: timestamp out of range for platform time_t 

Как я могу обойти эту проблему? предполагая, что я хочу остановиться на 32-битном python (работает 2.7.2)

Я заметил, что могу преобразовать max int в объект datetime, а затем добавить любые дополнительные данные с timedeltas, но я не мог придумать особо эффективного или хороший способ сделать это на практике. Каким образом я могу преобразовать эти метки времени 2038+ в объекты datetime?

ответ

7

Подумайте я работал его, и я был своего рода удивлен, что это не бросает то же исключение

>>> datetime.datetime.fromtimestamp(0) + datetime.timedelta(seconds=2147570047) 
datetime.datetime(2038, 1, 20, 4, 14, 7) 

EDIT: Это не идеальное решение, кажется, немного проблем со временем зоны (я в данный момент времени BST (+1), так что может объяснить, почему это ниже час врозь)

>>> datetime.datetime.fromtimestamp(2047570047) 
datetime.datetime(2034, 11, 19, 17, 27, 27) 
>>> datetime.datetime.fromtimestamp(0) + datetime.timedelta(seconds=2047570047) 
datetime.datetime(2034, 11, 19, 18, 27, 27) 
+3

причина 'fromtimestamp' имеет проблемы (на некоторых системах) является то, что она основана на системе C функции. В документации отмечается, что это часто ограничивается 1970-2038 годами. «Timedelta», с другой стороны, настраивается на Python и обрабатывает длительности до чуть менее одного миллиарда дней. –