2012-04-21 20 views
27

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')Use datetime.strftime() años antes de 1900? ("Requiero años> = 1900")

Pero tengo la época de 1601, por lo que el espectáculo de error: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

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

+4

Necesitará una biblioteca externa. mxDateTime hace remonta al año 0. http://www.egenix.com/products/python/mxBase/mxDateTime/doc/ –

Respuesta

13

Usted puede hacer lo siguiente:

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

Ahora bien, si usted quiere 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 parece que hay un parche para strftime de solucionar este problema comportamiento here (no probado)

10

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

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

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

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

Hay varias maneras de alterar strftime para que maneje las fechas pre-1900:

  • hay un recipe at ASPN que le da una strftime método independiente que se puede llamar con un objeto de fecha: aspn_recipe.strftime(dt, fmt) si lo configuró usted mismo en un módulo
  • Como @stephen-rumbalski said, el paquete externo mxDateTime es compatible con esto; pero eso es el uso de un sistema de fechas objeto totalmente diferente
  • partir de la versión 1.5, el paquete virtualtime parchara tanto time.strftimedatetime.datetime.strftime y se comporte como en Python + 3.3. Puede aprovechar esto sin habilitar las otras funciones de tiempo virtual. (responsabilidad: yo 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. Adicionalmente, pre 3.2 versiones interpretar entre años 0 y 99 como entre 1969 y 2068. Las versiones de Python desde 3.3 en adelante admiten todos los años positivos en datetime (y años negativos en time.strftime), y time.strftime no hace ningún mapeo de años entre 0 y 99.

El original Python bug explica que decidieron que esto era una característica en Python 2.7 (presumiblemente ya que evita la falta de sistema de strftime apoyo para estas fechas), y luego trabajó gradualmente en él en la serie Python 3, por reimplementar funcionalidad.

+0

Probé la monkeypatcher virtualtime, pero no puedo encontrar ninguna documentación y no puedo averiguar lo que tengo que hacer para hacer que se vaya. –

+0

que utiliza 'sudo pip instalación virtualtime' instalarlo, luego se importa con' virtualtime' importación y llamados 'virtualtime.enable()'. Funcionó muy bien! – nickb

6

recomiendo el uso de arrow (que es un paquete de abstracción sobre fecha y hora y dateutil), que es muy fácil de manejar todo tipo de objetos de fecha y hora, 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 y a 162 ans' 
Cuestiones relacionadas