¿Usar datetime.strftime () en años anteriores a 1900? (“Requiere año> = 1900”)

Utilicé: 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')

Pero tengo el tiempo de 1601, por lo que el error muestra: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900 ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

Utilicé python2.7, ¿cómo puedo hacerlo? ¡Muchas gracias!

Puedes hacer lo siguiente:

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

Ahora si quieres tener exactamente el mismo formato que el anterior:

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

No es que parezca que hay un parche para corregir este comportamiento aquí (no probado)

el método de isoformat acepta un parámetro que especifica los caracteres que dividen la parte de la fecha de la parte de tiempo de un objeto de fecha y hora en su representación. Por lo tanto:

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

Deberías hacerlo. Además, si desea eliminar los microsegundos, puede operar una división.

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

Hay varias formas de modificar el tiempo de strftime para que maneje las fechas anteriores a 1900:

  • Hay una receta en ASPN que le brinda un método de tiempo de strftime separado strftime que puede llamar con un objeto de fecha: aspn_recipe.strftime(dt, fmt) si lo configura usted mismo en un módulo
  • Como dijo @ stephen-rumbalski , el paquete externo mxDateTime admite esto; Pero eso es usar un sistema de objetos de fecha totalmente diferente
  • A partir de la versión 1.5 , el paquete de tiempo virtual aplicará parches a time.strftime y datetime.datetime.strftime para que se comporten como en Python 3.3 +. Puede aprovechar esto sin habilitar las otras funciones de tiempo virtual. ( Descargo de responsabilidad: trabajo en este paquete )

Tenga en cuenta que Python 2.7 , 3.0 y 3.1 tienen errores antes del año 1900, Python 3.2 tiene errores antes del año 1000. Además, las versiones anteriores a 3.2 interpretan los años entre 0 y 99 como entre 1969 y 2068 . Las versiones de Python a partir de 3.3 soportan todos los años positivos en datetime (y negativos en time.strftime ), y time.strftime no hace ningún mapeo de años entre 0 y 99 .

El error original de Python explica que decidieron que se trataba de una característica de Python 2.7 (presumiblemente, ya que evitaba la falta de soporte de tiempo de strftime del sistema para estas fechas), y luego trabajó gradualmente en la serie Python 3, reimplementando la funcionalidad.

Recomiendo usar arrow (que es un paquete de abstracción en datetime y dateutil), es muy fácil manejar todo tipo de objetos de datetime, incluso en Python 2.6 / 7.x y con fechas anteriores a 1900.

Por ejemplo:

 >>> 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 ya 162 ans'