Python Language Analisi di una stringa con un nome breve fuso orario in un oggetto datetime timezone aware


Esempio

Utilizzando la libreria dateutil come nell'esempio precedente dateutil timestamp sensibili al fuso orario , è anche possibile analizzare i timestamp con un nome di fuso orario "breve" specificato.

Per le date formattate con i nomi di zona breve tempo o abbreviazioni, che sono generalmente ambigua (ad esempio CST, che potrebbe essere centrale Standard Time, Cina Standard Time, Cuba Standard Time, ecc - più può essere trovato qui ) o non necessariamente disponibili in un database standard , è necessario specificare una mappatura tra l'abbreviazione del fuso orario e l'oggetto tzinfo .

from dateutil import tz
from dateutil.parser import parse

ET = tz.gettz('US/Eastern')
CT = tz.gettz('US/Central')
MT = tz.gettz('US/Mountain')
PT = tz.gettz('US/Pacific')

us_tzinfos = {'CST': CT, 'CDT': CT,
              'EST': ET, 'EDT': ET,
              'MST': MT, 'MDT': MT,
              'PST': PT, 'PDT': PT}

dt_est = parse('2014-01-02 04:00:00 EST', tzinfos=us_tzinfos)
dt_pst = parse('2016-03-11 16:00:00 PST', tzinfos=us_tzinfos)

Dopo aver eseguito questo:

dt_est
# datetime.datetime(2014, 1, 2, 4, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Eastern'))
dt_pst
# datetime.datetime(2016, 3, 11, 16, 0, tzinfo=tzfile('/usr/share/zoneinfo/US/Pacific'))

Vale la pena notare che se si utilizza un pytz fuso orario con questo metodo, non sarà adeguatamente localizzato:

from dateutil.parser import parse
import pytz

EST = pytz.timezone('America/New_York')
dt = parse('2014-02-03 09:17:00 EST', tzinfos={'EST': EST})

Questo semplicemente associa il pytz orario pytz al datetime:

dt.tzinfo # Will be in Local Mean Time!
# <DstTzInfo 'America/New_York' LMT-1 day, 19:04:00 STD>

Se si utilizza questo metodo, è consigliabile localize la parte ingenua del datetime dopo l'analisi:

dt_fixed = dt.tzinfo.localize(dt.replace(tzinfo=None))
dt_fixed.tzinfo # Now it's EST.
# <DstTzInfo 'America/New_York' EST-1 day, 19:00:00 STD>)