2010-07-20 14 views
7

Sto provando a convertire un timestamp di stringa in un oggetto datetime appropriato. Il problema che sto avendo è che c'è un offset nel fuso orario e tutto quello che sto facendo non sembra funzionare.Converte timestamp stringa (con offset fuso orario) in ora locale. . ? python

In definitiva, voglio convertire il timestamp della stringa in un oggetto datetime nel fuso orario della mia macchina.

# string timestamp  
date = u"Fri, 16 Jul 2010 07:08:23 -0700" 
+1

potete inserire quello che hai fino ad ora per il codice? – bstpierre

risposta

8

Il pacchetto dateutil è a portata di mano per la data di analisi/orari:

In [10]: date = u"Fri, 16 Jul 2010 07:08:23 -0700" 

In [11]: from dateutil.parser import parse 

In [12]: parse(date) 
Out[12]: datetime.datetime(2010, 7, 16, 7, 8, 23, tzinfo=tzoffset(None, -25200)) 

Infine, per convertire in tuo fuso orario locale,

In [13]: parse(date).astimezone(YOUR_LOCAL_TIMEZONE) 
+0

come faccio a prendere questo e trasformarlo in una rappresentazione temporale che corrisponde al mio fuso orario corrente? e grazie per questo a parte :) – alfredo

+0

Felice di aiutare. È possibile utilizzare il metodo 'astimezone' dell'oggetto datetime restituito da analisi. Vedi questa domanda per i dettagli: http://stackoverflow.com/questions/79797/how-do-i-convert-local-time-to-utc-in-python – ars

+0

Dateutil rocks! analizzato la mia stringa ("2013-10-22T21: 56: 00.000-03: 00") senza che io debba fornire una stringa di formato. – fccoelho

4

Sembra datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S %z') dovrebbe funzionare, ma secondo a this bug report ci sono problemi con l'elaborazione %z. Quindi, probabilmente dovrete gestire il fuso orario da soli:

import datetime 

d = u"Fri, 16 Jul 2010 07:08:23 -0700" 

d, tz_info = d[:-5], d[-5:] 
neg, hours, minutes = tz_info[0], int(tz_info[1:3]), int(tz_info[3:]) 
if neg == '-': 
    hours, minutes = hours * -1, minutes * -1 

d = datetime.datetime.strptime(d, '%a, %d %b %Y %H:%M:%S ') 
print d 
print d + datetime.timedelta(hours = hours, minutes = minutes) 
0

Ecco una soluzione stdlib:

>>> from datetime import datetime 
>>> from email.utils import mktime_tz, parsedate_tz 
>>> datetime.fromtimestamp(mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700"))) 
datetime.datetime(2010, 7, 16, 16, 8, 23) # your local time may be different 

Vedi anche, Python: parsing date with timezone from an email.

Nota: fromtimestamp() potrebbe non riuscire se il fuso orario locale aveva compensato in passato (2010) e se non fa uso di un database storico fuso orario sulla piattaforma data UTC diverso. Per risolvere il problema, è possibile utilizzare tzlocal.get_localzone(), per ottenere un oggetto tzinfo pytz che rappresenta il fuso orario locale. pytz fornisce l'accesso al database tz in maniera portatile:

>>> timestamp = mktime_tz(parsedate_tz(u"Fri, 16 Jul 2010 07:08:23 -0700")) 
>>> import tzlocal # $ pip install tzlocal 
>>> str(datetime.fromtimestamp(timestamp, tzlocal.get_localzone())) 
'2010-07-16 16:08:23+02:00' 
Problemi correlati