Использовать 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, как я могу это сделать? Большое спасибо!
Ответы
Ответ 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'