2009-08-19 10 views
6

Diciamo che ho un fuso orario come "2009-08-18 13: 52: 54-04". Posso analizzare la maggior parte di esso utilizzando una linea come questa:Come analizzo i fusi orari con gli offset UTC in Python?

datetime.strptime(time_string, "%Y-%m-%d %H:%M:%S") 

Tuttavia, non posso ottenere il fuso orario al lavoro. C'è una Z% che gestisce i fusi orari testuali ("EST", "UTC", ecc.) Ma non vedo nulla che possa analizzare "-04".

+0

Dupe- [Come traduco una stringa datetime ISO 8601 in un oggetto Python datetime?] (Http://stackoverflow.com/questions/969285/how-do-i-translate-a-iso-8601-datetime-string-in-a-python-datetime-object/3908349 # 3908349) (e la risposta è 'dateutil.parser.parse (datestring) 'in entrambi) – Yarin

+0

correlati: [Come analizzare date con -0400 stringa timezone in python?] (http://stackoverflow.com/q/1101508/4279) – jfs

risposta

0

mi sono imbattuto lo stesso problema da poco e ha lavorato intorno ad esso utilizzando questo codice:

gmt_offset_str = time_string[-3:] 
gmt_offset_seconds = int(gmt_offset_str)*60*60 
timestamp = time.strptime(time_string[:-4], '%Y-%m-%d %H:%M:%S') 
return time.localtime(time.mktime(timestamp)-gmt_offset_seconds) 

Vorrei anche essere interessati a una soluzione più elegante.

+3

È un soluzione piuttosto ingenua. Funziona, ma avrai problemi brutti quando lavorerai per i tempi di risparmio diurno e quelli che non lo usano. È meglio usare gli oggetti built-in. – voyager

+0

'mktime()' non è corretto qui. Usa invece 'calendar.timegm()'. 'email.utils.mktime_tz' da stdlib aveva lo stesso bug prima di Python 2.7.4 – jfs

0

Si può fare directrly sul costruttore: class datetime.datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]), tzinfo essendo un oggetto dervided datetime.tzinfo.

tzinfo è una classe di base astratta, il che significa che questa classe non dovrebbe essere istanziata direttamente. È necessario derivare una sottoclasse concreta e (almeno) fornire implementazioni dei metodi standard tzinfo necessari per i metodi datetime utilizzati. Il modulo datetime non fornisce sottoclassi concrete di tzinfo.

Che cosa è necessario eseguire l'override del metodo è utcoffset(self, dt).

Offset di ritorno dell'ora locale da UTC, in minuti a est di UTC. Se l'ora locale è a ovest di UTC, questa dovrebbe essere negativa. Si noti che questo è inteso essere lo scostamento totale da UTC; per esempio, se un oggetto tzinfo rappresenta entrambe le regolazioni di fuso orario e DST, utcoffset() dovrebbe restituire la loro somma. Se l'offset UTC non è noto, restituire Nessuno. Altrimenti il ​​valore restituito deve essere un oggetto timedelta che specifica un numero intero di minuti nell'intervallo compreso tra -1439 e 1439 (1440 = 24 * 60; l'entità dell'offset deve essere inferiore a un giorno). La maggior parte delle implementazioni di utcoffset() sarà probabilmente simile a uno di questi due:

return CONSTANT # fixed-offset class

return CONSTANT + self.dst(dt) # daylight-aware class

Se utcoffset() non restituisce None, dst() non dovrebbe restituire None neanche.

L'implementazione predefinita di utcoffset() solleva NotImplementedError.

22

Forse potresti usare dateutil.parser.parse? Questo metodo è citato anche su wiki.python.org/WorkingWithTime.

>>> from dateutil.parser import parse 
>>> parse("2009-08-18 13:52:54-04") 
datetime.datetime(2009, 8, 18, 13, 52, 54, tzinfo=tzoffset(None, -14400)) 

(è questa domanda un duplicato?)

+3

+1 per datautile. Questa è la tua risposta – Yarin