Парсы датируются до 1000 года

Рассмотрим следующий пример:

from datetime import datetime


FMT = "%Y-%m-%dT%H:%M:%S"

original_date = datetime(1,1,1)

s = original_date.strftime(FMT)  # This is '1-01-01T00:00:00'

Когда я теперь пытаюсь проанализировать эту строку обратно в datetime с точным форматом, который я использовал для его сериализации, во-первых, на меня бросается ValueError:

datetime.strptime(s, FMT)

ValueError: данные времени '1-01-01T00: 00: 00' не соответствует формату '% Y-% m-% dT% H:% M:% S'

Однако

datetime.strptime('0001-01-01T00:00:00', FMT)

работает как ожидалось. Я бы ожидал, что strptime сможет обрабатывать все strftime. Я всегда считал эти функции противоположными друг другу.

Почему original_date.strftime(FMT) не приводит к нулевому заполнению года? Есть ли причина для этой несогласованности?

Ответ 1

Результаты для %Y не соответствуют всем платформам. В Mac OS X он вернет 0001, но в Linux он вернет 1.

В Linux вы можете использовать %4Y для создания 0001 как значения года.

Это известная проблема: https://bugs.python.org/issue13305.

В документации для strftime() и strptime() также указано:

Полный набор поддерживаемых форматных кодов зависит от разных платформ, поскольку Python вызывает функцию платформы strftime() платформы C, а вариации платформы являются общими. Чтобы просмотреть полный набор кодов формата, поддерживаемых на вашей платформе, обратитесь к документации по strftime (3).