2012-04-21 11 views
27

ho usato: 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')Usa datetime.strftime() negli anni precedenti al 1900? ("Richiedo anno> = 1900")

Ma non ho il tempo di 1601, quindi lo spettacolo di errore: ValueError: year=1601 is before 1900; the datetime strftime() methods require year >= 1900

ho usato python2.7, come posso farlo ? Molte grazie!

+4

Avrete bisogno di una libreria esterna. mxDateTime risale all'anno 0. http://www.egenix.com/products/python/mxBase/mxDateTime/doc/ –

risposta

13

È possibile effettuare le seguenti operazioni:

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

Ora, se si vuole avere esattamente lo stesso formato come sopra:

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

Non che ci sembra essere una patch per strftime per risolvere questo problema comportamento here (non testato)

10

il metodo isoformat accetta un parametro che specifica il carattere (i) che divide la parte della data dalla parte temporale di un oggetto datetime nella sua rappresentazione. Pertanto:

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

dovrebbe farlo. Inoltre, se si desidera rimuovere i microsecondi è possibile utilizzare una divisione.

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

Ci sono vari modi per alterare strftime in modo che gestisce le date di pre-1900:

  • C'è un recipe at ASPN che ti dà un metodo separato strftime che si può chiamare con un oggetto data: aspn_recipe.strftime(dt, fmt) se lo hai impostato tu stesso in un modulo
  • come @stephen-rumbalski said, il pacchetto esterno mxDateTime supporta questo; ma che sta usando un tipo completamente diverso sistema di data oggetto
  • A partire dalla versione 1.5, il pacchetto sarà virtualtime rattoppare sia time.strftime e datetime.datetime.strftime a comportarsi come in Python 3.3 +. Puoi approfittare di questo senza abilitare le altre funzioni del tempo virtuale. (Disclaimer: io lavoro su questo pacchetto)

Nota che Python 2.7, 3.0 e 3.1 hanno gli errori prima del 1900, Python 3.2 ha errori prima dell'anno 1000. Inoltre, pre 3.2 versioni interpretare anni tra 0 e 99 tra 1969 e 2068. Versioni di Python dal 3.3 in poi supporto tutti gli anni positivi in ​​datetime (e anni negativi in ​​time.strftime) e time.strftime non esegue alcuna mappatura degli anni tra 0 e 99.

L'originale Python bug spiega che hanno deciso che questa era una funzione in Python 2.7 (presumibilmente in quanto evita la mancanza di sistema strftime il supporto per queste date), e poi gradualmente ha lavorato nella serie Python 3, da reimplementare la funzionalità.

+0

Ho provato il monkeypatcher virtualtime, ma non riesco a trovare alcuna documentazione e non riesco a capire cosa devo fare per farlo andare. –

+0

Ho usato 'sudo pip install virtualtime' per installarlo, quindi l'ho importato con' import virtualtime' e chiamato 'virtualtime.enable()'. Ha funzionato alla grande! – nickb

6

mi consiglia di utilizzare arrow (che è un pacchetto di astrazione su datetime e dateutil), è davvero facile da maneggiare ogni tipo di oggetti datetime, anche in Python 2.6/7.x e con date prima del 1900.

Ad esempio:

>>> 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' 
Problemi correlati