Подтвердить что ты не робот

Использовать datetime.strftime() до 1900 года? ( "требуется год >= 1900" )

Я использовал: utctime = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds = tup[5]) last_visit_time = "Last visit time:"+ utctime.strftime('%Y-%m-%d %H:%M:%S')

Но у меня есть время 1601, поэтому ошибка показывает: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

Я использовал python2.7, как я могу это сделать? Большое спасибо!

4b9b3361

Ответ 1

Вы можете сделать следующее:

>>> utctime.isoformat()
'1601-01-01T00:00:00.000050'

Теперь, если вы хотите иметь точно такой же формат, как указано выше:

iso = utctime.isoformat()
tokens = iso.strip().split("T")
last_visit_time = "Last visit time: %s %s" % (tokens[0], tokens[1].strip().split(".")[0])

Не то, чтобы, по-видимому, был патч для strftime, чтобы исправить это поведение здесь (не тестировалось)

Ответ 2

метод isoformat принимает параметр, определяющий символ (символы), разделяющий часть даты от временной части datetime obj в ее представлении. Поэтому:

>>> utctime.isoformat(" ")
'1601-01-01 00:00:00.000050'

должен это сделать. Кроме того, если вы хотите удалить микросекунды, вы можете использовать раскол.

>>> utctime.isoformat(" ").split(".")[0]
'1601-01-01 00:00:00'

Ответ 3

Существуют различные способы изменить strftime так, чтобы он обрабатывал даты до 1900:

  • Там рецепт в ASPN, который дает вам отдельный метод strftime, который вы можете вызвать с помощью объекта даты: aspn_recipe.strftime(dt, fmt) if вы сами устанавливаете его в модуле
  • Как @stephen-rumbalski сказал, внешний mxDateTime пакет поддерживает это; но что использование совершенно другой системы объектов даты
  • Начиная с версии 1.5, пакет virtualtime будет исправлять как time.strftime, так и datetime.datetime.strftime, чтобы вести себя как в Python 3.3+. Вы можете воспользоваться этим, не позволяя другим функциям виртуального времени. (Отказ от ответственности: я работаю над этим пакетом)

Обратите внимание, что Python 2.7, 3.0 и 3.1 имеют ошибки до 1900 года, Python 3.2 имеет ошибки до 1000 года. Кроме того, pre- 3.2 версии интерпретируют годы между 0 и 99 как между 1969 и 2068. Версии Python от 3.3 поддерживают все положительные годы в datetime (и отрицательные годы в time.strftime), а time.strftime не выполняет сопоставление лет между 0 и 99.

Оригинальная ошибка Python объясняет, что они решили, что это была функция в Python 2.7 (предположительно, поскольку она избегала недостатка системы strftime поддержка этих дат), а затем постепенно работал над ним в серии Python 3, переопределяя функциональность.

Ответ 4

Я рекомендую использовать arrow (который является абстракционным пакетом в datetime и dateutil), он действительно легко обрабатывает все типы объектов datetime, даже в Python 2.6/7.x и с датами до 1900 года.

Например:

>>> import arrow

>>> in_date_str = "1853-10-30T13:36:41.942623+00:00"
>>> in_date_obj = arrow.get(crea)
>>> print(in_date_obj)
arrow[1853-10-30T13:36:41.942623+00:00]>

# basic formatting
>>> in_date_obj.format()
u'1853-10-30 13:36:41-00:00'

# advanced formatting
>>> in_date_obj.format("dddd D MMMM YYYY", "fr_FR")
u'Dimanche 30 Octobre 1853'

# humanized delta
>>> in_date_obj.humanize()
u'162 years ago'
# easy localization handling
>>> in_date_obj.humanize(locale="fr_FR")
u'il y a 162 ans'