Fuso orario di analisi datetime incoerente in Python
Quando eseguo quanto segue in Python 3.X
import datetime
DATE_TS_FORMAT = '%Y-%m-%d %H:%M:%S.%f %Z'
date_ts = datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
date_ts = datetime.datetime.strptime(date_ts, DATE_TS_FORMAT)
date_ts = date_ts.strftime(DATE_TS_FORMAT)
print(date_ts)
ottengo
2019-01-02 03:04:05.000000 UTC
2019-01-02 03:04:05.000000
Perché le informazioni sul fuso orario sono scomparse e come posso risolvere questo problema?
Risposte
Davvero incoerente ... Il punto è che %Zfa strptime accettare certe stringhe (GMT, UTC e qualsiasi valore in time.tzname - docs ), ma in realtà non ne ricava nulla. Ex:
from datetime import datetime
s = "2019-01-02 03:04:05.000000 UTC"
dt = datetime.strptime(s, '%Y-%m-%d %H:%M:%S.%f %Z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5)
L'oggetto datetime risultante è ingenuo; nessun segno di UTC più.
Per tenere conto di questo comportamento, potresti post-elaborare l'oggetto datetime, qualcosa di simile
if "UTC" in s:
dt = dt.replace(tzinfo=timezone.utc)
(che penso sia un po 'doloroso ...) o sostituire "UTC" con qualcosa che %zanalizza UTC 1 ,
dt = datetime.strptime(s.replace("UTC", "+00:00"), '%Y-%m-%d %H:%M:%S.%f %z')
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=datetime.timezone.utc)
(che penso sia un po 'brutto ...) o usa un parser adatto, ad es
from dateutil.parser import parse
dt = parse(s)
print(repr(dt))
# datetime.datetime(2019, 1, 2, 3, 4, 5, tzinfo=tzutc())
print(dt.strftime('%Y-%m-%d %H:%M:%S.%f %Z'))
# 2019-01-02 03:04:05.000000 UTC
(che sarà un po 'più lento se le prestazioni sono un problema ...).
1 IMO, anche questo è incoerente; "+00: 00" potrebbe anche essere la differenza UTC di un fuso orario che a quell'ora ha una differenza UTC di 0 ore ...