2010-03-25 2 views
15

Я был поиск по всей сети и не может найти подходящее решение для этой проблемыPython | ошибка переполнения указываете ей

OverflowError: mktime argument out of range 

код, который вызывает это исключение

t = (1956, 3, 2, 0, 0, 0, 0, 0, 0) 
ser = time.mktime(t) 

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

Спасибо.

ответ

19

time.mktime вызывает базовую функцию mktime из библиотеки C платформы. Например, приведенный выше код, который вы опубликовали, отлично работает для меня в Mac OS X, хотя он возвращает отрицательное число, поскольку дата предшествует эпохе Unix. Поэтому причина в том, что реализация вашей платформы mktime, вероятно, не поддерживает даты до эпохи Unix. Вы можете использовать datetime модуль Python, чтобы построить datetime объект, соответствующий указанной даты, вычесть его из другого datetime объекта, который представляет эпоху Unix и использовать вычисленное timedelta объект, чтобы получить количество секунд с начала эпохи:

from datetime import datetime 
epoch = datetime(1970, 1, 1) 
t = datetime(1956, 3, 2) 
diff = t-epoch 
print diff.days * 24 * 3600 + diff.seconds 

Обновление: если вы используете Python 2.7 или выше, вы можете просто использовать print diff.total_seconds(), как указано ниже в комментарии Чада Миллера.

+1

print diff.total_seconds() –

+0

Спасибо, я обновил свой ответ. Python 2.5 и 2.6 были гораздо более распространены в 2010 году, когда я добавил этот ответ, и 'total_seconds()' доступен начиная с версии 2.7. –

Смежные вопросы