2012-10-19 11 views
13

Sto lavorando alla conversione di timecamp in epoca in date in diversi fusi orari con pytz. Quello che sto cercando di fare è creare un oggetto DateTime che accetti un fuso orario del database Olson e un tempo storico e restituisca un oggetto datetime localizzato. Alla fine ho bisogno di rispondere a domande del tipo "Che ore erano a New York in epoca 1350663248?"Localizzare Epoch Time con pytz in Python

qualcosa non funziona correttamente qui:

import datetime, pytz, time 

class DateTime: 
    def __init__(self, timezone, epoch): 
     self.timezone = timezone 
     self.epoch = epoch 
     timezoneobject = pytz.timezone(timezone) 
     datetimeobject = datetime.datetime.fromtimestamp(self.epoch) 
     self.datetime = timezoneobject.localize(datetimeobject) 

    def hour(self): 
     return self.datetime.hour 

if __name__=='__main__': 
    epoch = time.time() 
    dt = DateTime('America/Los_Angeles',epoch) 
    print dt.datetime.hour 
    dt = DateTime('America/New_York',epoch) 
    print dt.datetime.hour 

Questa stampa la stessa ora, mentre si dovrebbe essere di 3 o giù di lì ore avanti. Cosa sta andando storto qui? Sono un principiante di Python, ogni aiuto è apprezzato!

+0

Si sta utilizzando la terminologia sbagliata qui. L'epoca è * sempre * 1-1-1970, mezzanotte UTC. Quello che hai è un timestamp UNIX, che è un offset dall'epoca. Vedi https://en.wikipedia.org/wiki/Unix_epoch –

+0

solo un nome di variabile, si potrebbe chiamarlo 'epoch_time' non fa differenza per il problema – mobiusinversion

risposta

-3
epochdt = datetime.datetime.fromtimestamp(epoch) 
timezone1 = timezone("Timezone/String") 
adjusted_datetime = timezone1.localize(epochdt) 

Lavorando dalla memoria, quindi scusate eventuali errori di sintassi, ma questo dovrebbe portarvi sulla giusta strada.

MODIFICA: mancava la parte sulla conoscenza dell'ora, ecc. Python ha un ottimo Time/Date Formatting. In sostanza, la parte inferiore di quel collegamento è la tabella che mostra come estrarre diversi attributi dall'oggetto datetime.

+0

Questo è ciò che l'OP sta facendo. –

+0

È molto simile all'approccio iniziale, ma l'implementazione continua a stampare la stessa ora (nel codice __main__ sopra). Fondamentalmente è 8am dove sono adesso. Quello che sto cercando di capire è come ottenere il codice di cui sopra per stampare 8 e 11m cioè per America/Los_Angeles e America/New_York rispettivamente. – mobiusinversion

19

datetime.fromtimestamp(self.epoch) restituisce localtime che non deve essere utilizzato con un timezone.localize() arbitrario; è necessario utcfromtimestamp() per ottenere datetime in UTC e quindi convertirlo in un fuso orario desiderato:

from datetime import datetime 
import pytz 

# get time in UTC 
utc_dt = datetime.utcfromtimestamp(posix_timestamp).replace(tzinfo=pytz.utc) 

# convert it to tz 
tz = pytz.timezone('America/New_York') 
dt = utc_dt.astimezone(tz) 

# print it 
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z')) 

O un'alternativa più semplice è quello di costruire dal timestamp direttamente:

from datetime import datetime 
import pytz 

# get time in tz 
tz = pytz.timezone('America/New_York') 
dt = datetime.fromtimestamp(posix_timestamp, tz) 
# print it 
print(dt.strftime('%Y-%m-%d %H:%M:%S %Z%z')) 

Si converte da UTC implicitamente in questo Astuccio.

0

Per creare l'oggetto datetime appartenenti a particolari fuso orario da un timestamp unix, si può passare l'oggetto pytz come parametro tz durante la creazione datetime. Per esempio:

>>> from datetime import datetime 
>>> import pytz 

>>> datetime.fromtimestamp(1350663248, tz= pytz.timezone('America/New_York')) 
datetime.datetime(2012, 10, 19, 12, 14, 8, tzinfo=<DstTzInfo 'America/New_York' EDT-1 day, 20:00:00 DST>) 

È possibile ottenere l'elenco di tutti i fusi orari utilizzando pytz.all_timezones.

Anche dare un'occhiata al wiki List of tz database time zones.