2012-10-19 23 views
13

Pracuję nad konwertowaniem znaczników czasu epoki na daty w różnych strefach czasowych z pytz. Próbuję utworzyć obiekt DateTime, który akceptuje strefę czasową bazy danych Olson i czas epoki i zwraca lokalny obiekt datetime. W końcu muszę odpowiedzieć na pytania typu "Która godzina była w Nowym Jorku w epoce 1350663248?"Lokalizowanie czasu epoki za pomocą pytz w języku Python

Coś nie działa prawidłowo tutaj:

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 

Wypisuje tę samą godzinę, natomiast trzeba być 3 lub tak godzin naprzód. Co tu nie pasuje? Jestem początkującym początkującym Pythonem, każda pomoc jest doceniana!

+0

Używasz tutaj niewłaściwej terminologii. Epoką jest zawsze * 1-1-1970, północ UTC. To, co masz, to znacznik czasu UNIX, który jest przesunięciem względem epoki. Zobacz https://en.wikipedia.org/wiki/Unix_epoch –

+0

tylko nazwa zmiennej, możesz nazwać ją 'epoch_time' nie ma znaczenia dla problemu – mobiusinversion

Odpowiedz

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

Praca z pamięci, więc przepraszam za błędy składniowe, ale to powinno Cię poprawić.

EDYCJA: Nie przyjęto części o poznaniu godziny itp. Python ma świetny Time/Date Formatting. Prawie na samym dole tego linku znajduje się tabela pokazująca, jak wyciągnąć różne atrybuty z obiektu datetime.

+0

Tak właśnie robi OP. –

+0

To jest bardzo podobne do początkowego podejścia, ale implementacja tego nadal wypisuje tę samą godzinę (w kodzie __main__ powyżej). Zasadniczo jego 8 rano, gdzie jestem teraz. Co próbuję wymyślić jest, jak uzyskać powyższy kod do drukowania 8 i 11m, tj. Odpowiednio dla America/Los_Angeles i America/New_York. – mobiusinversion

19

datetime.fromtimestamp(self.epoch) zwraca czas lokalny, który nie powinien być używany z dowolną funkcją timezone.localize(); trzeba utcfromtimestamp() dostać datetime w UTC, a następnie przekształcić go do żądanej strefy czasowej:

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')) 

lub prostszą alternatywą jest budowa od datownika bezpośrednio:

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')) 

konwertuje go od UTC niejawnie w ten walizka.

0

Do tworzenia obiektu datetime należącej do konkretnej strefy czasowej od uniksowego znacznika czasu, można przekazać obiekt pytz jako parametr tz podczas tworzenia datetime. Na przykład:

>>> 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>) 

Można uzyskać listę wszystkich stref czasowych z wykorzystaniem pytz.all_timezones.

Zobacz także: List of tz database time zones wiki.

Powiązane problemy