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 не поддерживает времена ниже определенного значения.