Мы столкнулись с интересной проблемой mtime, с которой столкнулись в этой области. Я планирую отправить отчет об ошибке, но хотел получить информацию со стороны.
Файл, хранящийся на сервере windows, имел дату последнего изменения '1/1/4501' (это 4501 год. ). os.path.getmtime()
возвращает действительную метку времени, но когда мы пытаемся передать ее обратно в datetime.datetime.fromtimestamp()
, мы получаем OSError
.
Есть несколько дискуссий по SO, которые обсуждают эту проблему, например: Python fromtimestamp OSError . Однако в большинстве случаев, которые мы могли найти, ОП имели дело с датами производства, которые явно выходили за пределы поддерживаемого диапазона эпохи платформы. Генерация OSError
, когда дата превышает поддержку эпохи на Windows, согласуется с python документами.
В нашем случае дата явно поддерживается Windows, о чем свидетельствует ее хранение в файловая система. Далее, мы можем воспроизвести ситуацию с помощью утилиты cygwin touch
.
>>> import os, datetime
>>> os.system('touch -d "4501-01-01" file.txt')
>>> t = os.path.getmtime('file.txt')
>>> datetime.datetime.fromtimestamp(t)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
Что интересно, мы можем вручную преобразовать его с привязкой к эпохе
>>> datetime.datetime(1970, 1, 1) + datetime.timedelta(seconds=t)
datetime.datetime(4501, 1, 1, 5, 0)
Мы использовали Windows 10-Pro для наших тестов работает python 3.8.1.