Питон | Ошибка переполнения mktime - PullRequest
16 голосов
/ 25 марта 2010

Я искал по всей сети и не смог найти подходящее решение для этой проблемы

OverflowError: mktime argument out of range

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

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

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

Спасибо.

1 Ответ

20 голосов
/ 25 марта 2010

time.mktime вызывает базовую функцию mktime из библиотеки C. платформы. Например, вышеприведенный код, который вы опубликовали, отлично работает для меня в Mac OS X, хотя он возвращает отрицательное число, так как дата предшествует эпохе Unix. Так что причина в том, что реализация вашей платформы mktime, вероятно, не поддерживает даты до эпохи Unix. Вы можете использовать модуль Python datetime для создания объекта 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(), как отмечено ниже в комментарии Чада Миллера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...