2014-12-02 37 views
11

Sto tentando di aggiungere due volte insieme. La data e ora ISO   8601 è "1984-06-02T19: 05: 00.000Z" e mi piacerebbe convertirla in secondi. Ho provato a utilizzare il modulo Python iso8601, ma è solo un parser.Conversione di data e ora ISO 8601 in secondi in Python

Qualche suggerimento?

+0

Quali secondi? Secondi dall'epoca? –

+0

Credo di si. Questa è la mia prima volta che lavoro con le date. –

+0

related: [Converti un tempo RFC 3339 in un timestamp standard di Python] (http://stackoverflow.com/q/1941927/4279) – jfs

risposta

9

Se si desidera ottenere i secondi dal periodo, è possibile utilizzare python-dateutil per convertirlo in un oggetto datetime e poi convertirlo in modo secondi utilizzando il metodo strftime. In questo modo:

>>> import dateutil.parser as dp 
>>> t = '1984-06-02T19:05:00.000Z' 
>>> parsed_t = dp.parse(t) 
>>> t_in_seconds = parsed_t.strftime('%s') 
>>> t_in_seconds 
'455047500' 

Così si erano a metà strada :)

+0

Grazie a feynman21. Sto guardando la documentazione di dateutil.parser. Cosa succede se voglio riconvertirlo in un formato ISO. –

+1

controlla [questo] (https://docs.python.org/2/library/datetime.html). 'datetime.isoformat()' dovrebbe avere quello che stai cercando. Quindi dovresti prima convertire la stringa in un oggetto 'datetime' usando' strptime' e poi chiamare 'isoformat' su quell'oggetto. – hopla

+0

http://stackoverflow.com/questions/3401428/how-to-get-an-isoformat-datetime-string-including-the-default-timezone Grazie mille per il vostro aiuto. –

7

la data è ora UTC in RFC 3339 format, si potrebbe analizzarlo utilizzando solo stdlib:

from datetime import datetime 

utc_dt = datetime.strptime('1984-06-02T19:05:00.000Z', '%Y-%m-%dT%H:%M:%S.%fZ') 

# Convert UTC datetime to seconds since the Epoch 
timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds() 
# -> 455051100.0 

Vedi anche Converting datetime.date to UTC timestamp in Python

Come si converte in formato ISO 8601?

Per convertire POSIX timestamp indietro, creare un oggetto UTC datetime da esso, e il formato mediante .strftime() metodo:

from datetime import datetime, timedelta 

utc_dt = datetime(1970, 1, 1) + timedelta(seconds=timestamp) 
print(utc_dt.strftime('%Y-%m-%dT%H:%M:%S.%fZ')) 
# -> 1984-06-02T19:05:00.000000Z 

Nota: Esso stampa sei cifre dopo la virgola (microsecondi). Per ottenere tre cifre, vedere Formatting microseconds to 2 decimal places (in fact converting microseconds into tens of microseconds).

+0

Per caso sai come riconvertirlo in formato ISO 8601? Finora anotherTime = datetime.datetime.fromtimestamp (timestamp) .isoformat() ma ha formato .000Z. Eventuali suggerimenti?Ho provato più cose, ma tutto ciò che ho ottenuto sono stati errori –

+0

@ user3426338: Ho aggiornato la risposta per mostrare come convertire il timestamp (numero) in una stringa di formato ISO 8601. – jfs

+0

grazie per tutto il vostro aiuto. –

-1

Ecco una soluzione in Python 3:

$ date +%s 
1428030452 
$ TZ=US/Pacific date -d @1428030452 '+%Y%m%d %H:%M:%S %z' 
20150402 20:07:32 -0700 
$ TZ=US/Eastern date -d @1428030452 '+%Y%m%d %H:%M:%S %z' 
20150402 23:07:32 -0400 
$ python3 
>>> from datetime import datetime,timezone 
>>> def iso2epoch(ts): 
...  return int(datetime.strptime(ts[:-6],"%Y%m%d %H:%M:%S").replace(tzinfo=timezone.utc).timestamp()) - (int(ts[-2:])*60 + 60 * 60 * int(ts[-4:-2]) * int(ts[-5:-4]+'1')) 
... 
>>> iso2epoch("20150402 20:07:32 -0700") 
1428030452 
>>> iso2epoch("20150402 23:07:32 -0400") 
1428030452 
>>> 
+0

Impressionante breve analisi stdlib TZ-aware puro! Ahimè, non è in formato ISO 8601 (vedi esempio in questione o esegui 'date --iso-8601 = ns'). Lo standard ISO consente * tonnellate * di formati in modo che la durata massima non sia dispendiosa, ma l'analisi dei soli formati di fuso orario "± hh: mm", "Z" (il sottoinsieme RFC3339) sarebbe sufficiente in molti casi. –