Il formato dell'ora ISO 8601 non memorizza il nome di un fuso orario, viene conservato solo l'offset UTC corrispondente.
Per convertire un file ctime in una stringa temporale ISO 8601 mantenendo l'offset UTC in Python 3:
>>> import os
>>> from datetime import datetime, timezone
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, timezone.utc)
>>> dt.astimezone().isoformat()
'2015-11-27T00:29:06.839600-05:00'
Il codice presuppone che il fuso orario locale sia fuso orario orientale (ET) e che il sistema fornisca un offset UTC corretto per il dato timestamp POSIX ( ts
), ovvero Python abbia accesso a un database di fuso orario storico sul sistema o che il fuso orario avesse il stesse regole a una determinata data.
Se hai bisogno di una soluzione portatile; utilizzare il pytz
modulo che fornisce l'accesso al database tz :
>>> import os
>>> from datetime import datetime
>>> import pytz # pip install pytz
>>> ts = os.path.getctime(some_file)
>>> dt = datetime.fromtimestamp(ts, pytz.timezone('America/New_York'))
>>> dt.isoformat()
'2015-11-27T00:29:06.839600-05:00'
Il risultato è lo stesso in questo caso.
Se è necessario il nome del fuso orario / abbreviazione / ID zona, memorizzarlo separatamente.
>>> dt.astimezone().strftime('%Y-%m-%d %H:%M:%S%z (%Z)')
'2015-11-27 00:29:06-0500 (EST)'
Nota: no, :
nell'offset UTC e l' EST
abbreviazione del fuso orario non fa parte del formato orario ISO 8601. Non è unico.
Librerie diverse / versioni diverse della stessa libreria possono utilizzare regole di fuso orario diverse per la stessa data / fuso orario. Se è una data futura, le regole potrebbero essere ancora sconosciute. In altre parole, la stessa ora UTC può corrispondere a un'ora locale diversa a seconda delle regole utilizzate: il salvataggio di un'ora nel formato ISO 8601 preserva l'ora UTC e l'ora locale che corrisponde alle regole del fuso orario attualmente in uso sulla piattaforma . Potrebbe essere necessario ricalcolare l'ora locale su una piattaforma diversa se ha regole diverse.