Python | Ошибка переполнения mktime
Я искал всю сеть и не нашел подходящего решения для этой проблемы
OverflowError: mktime argument out of range
Код, вызывающий это исключение
t = (1956, 3, 2, 0, 0, 0, 0, 0, 0)
ser = time.mktime(t)
Я хотел бы знать фактическую причину этого исключения, некоторые говорят, что дата не находится в допустимом диапазоне, но для меня это не имеет никакого смысла, и если есть диапазон того, что это может быть. Это зависит от системы, которую мы используем. Также хотелось бы знать хорошее решение этой проблемы.
Спасибо.
Ответы
Ответ 1
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()
, как указано ниже в комментарии Чада Миллера.
Ответ 2
Python time модуль
Хотя этот модуль всегда доступен, не все функции доступно на всех платформах. Большинство функций, определенных в этом вызов модуля библиотеки функций платформы C с тем же именем. Это может иногда полезно ознакомиться с документацией платформы, потому что семантика этих функций варьируется в зависимости от платформы.
Эпоха - это точка начала времени и платформа. зависимый. Для Unix эпоха - 1 января 1970 года, 00:00:00 (UTC). к узнать, какая эпоха на данной платформе, посмотреть на time.gmtime(0).
https://docs.python.org/3/library/time.html
Windows 10:
>>> time.gmtime(0)
time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=1, tm_isdst=0)
>>> list((ix for ix in time.gmtime(0)))
[1970, 1, 1, 0, 0, 0, 3, 1, 0]
>>> time.mktime(time.gmtime(0))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: mktime argument out of range
Функция библиотеки C в Windows 10 не поддерживает времена ниже определенного значения.