2012-06-12 1 views
9

Voglio convertire l'ora GMT all'ora EST e ottenere un timestamp. Ho provato quanto segue ma non so come impostare il fuso orario.Come convertire l'ora GMT in EST usando python

time = "Tue, 12 Jun 2012 14:03:10 GMT" 
timestamp2 = time.mktime(time.strptime(time, '%a, %d %b %Y %H:%M:%S GMT')) 
+7

Non c'è modo che il codice che hai postato venga eseguito, poiché hai chiamato una stringa 'time' e poi hai provato a usare una funzione dal pacchetto' time' che non è più accessibile con quel nome. – geoffspear

risposta

20

I fusi orari non sono incorporati nello standard Python: è necessario utilizzare un'altra libreria. pytz è una buona scelta.

>>> gmt = pytz.timezone('GMT') 
>>> eastern = pytz.timezone('US/Eastern') 
>>> time = "Tue, 12 Jun 2012 14:03:10 GMT" 
>>> date = datetime.datetime.strptime(time, '%a, %d %b %Y %H:%M:%S GMT') 
>>> date 
datetime.datetime(2012, 6, 12, 14, 3, 10) 
>>> dategmt = gmt.localize(date) 
>>> dategmt 
datetime.datetime(2012, 6, 12, 14, 3, 10, tzinfo=<StaticTzInfo 'GMT'>) 
>>> dateeastern = dategmt.astimezone(eastern) 
>>> dateeastern 
datetime.datetime(2012, 6, 12, 10, 3, 10, tzinfo=<DstTzInfo 'US/Eastern' EDT-1 day, 20:00:00 DST>) 
3

Utilizzando pytz

from datetime import datetime 
from pytz import timezone 
fmt = "%Y-%m-%d %H:%M:%S %Z%z" 
now_time = datetime.now(timezone('US/Eastern')) 
print now_time.strftime(fmt) 
0

Se è il fuso orario locale e le regole di fuso orario sono le stesse per il tempo dato come lo sono ora, allora si potrebbe utilizzare la soluzione stdlib solo (a parte qualche bordo casi):

#!/usr/bin/env python 
from email.utils import parsedate_tz, mktime_tz 
from datetime import datetime 

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT")) 
print(datetime.fromtimestamp(timestamp)) 
# -> 2012-06-12 10:03:10 

altrimenti è necessario i dati da un database storico fuso orario per ottenere l'offset UTC corretto. pytz module fornisce l'accesso a the tz database:

#!/usr/bin/env python 
from email.utils import parsedate_tz, mktime_tz 
from datetime import datetime 
import pytz # $ pip install pytz 

timestamp = mktime_tz(parsedate_tz("Tue, 12 Jun 2012 14:03:10 GMT")) 
eastern_dt = datetime.fromtimestamp(timestamp, pytz.timezone('America/New_York')) 
print(eastern_dt.strftime('%a, %d %b %Y %H:%M:%S %z (%Z)')) 
# -> Tue, 12 Jun 2012 10:03:10 -0400 (EDT) 

Nota: POSIX timestamp è lo stesso in tutto il mondo vale a dire, il fuso orario locale, non importa se si vuole trovare il timestamp (a meno che il fuso orario è di "destra" tipo) . Ecco come fare convert a utc time to the timestamp.