2010-05-13 4 views
5

Sto cercando di calcolare la differenza (in secondi) tra due date/orari formattati come segue:Come trovo la differenza tra le ore in diversi fusi orari in Python?

2010-05-11 17:07:33 UTC

2010-05-11 17:07:33 EDT

time1 = '2010-05-11 17:07:33 UTC' 
time2 = '2010-05-11 17:07:33 EDT' 
delta = time.mktime(time.strptime(time1,"%Y-%m-%d %H:%M:%S %Z"))-\ 
     time.mktime(time.strptime(time2, "%Y-%m-%d %H:%M:%S %Z")) 

il problema che ho avuto è EDT non viene riconosciuto, l'errore specifico è

ValueError: time data '2010-05-11 17:07:33 EDT' does not match format '%Y-%m-%d %H:%M:%S %Z' 
+2

Siete alla ricerca di questo http://labix.org/python-dateutil? Potrebbe essere più semplice di qualunque cosa tu stia facendo. –

+0

Grazie per le risposte. Ma anche usando pytz non riuscivo ancora a capire un modo migliore di analizzare la stringa "EDT" ecc. E convertirlo in un obj di pytz il fuso orario può essere qualsiasi abbreviazione di stringa di 3-4 lettere ma pytz usa "US/Eastern" . Devo creare una mappatura per convertire le abbreviazioni in formato "USA/orientale"? Sembra troppo per me. Grazie, – JasonA

+1

finisco per la costruzione di un file di testo con le voci come segue: << EDT \t Eastern Daylight Time (America del Nord) \t UTC-04 >> quindi cercare la voce utilizzando stringa 'EDT' ottenuto dalla stringa time Usando il valore -04 nel file posso usare mktime() per ottenere la differenza di tempo in secondi. Penso ancora che ci dovrebbe essere un modo più semplice per farlo ... Grazie, – JasonA

risposta

8

Scopri i pytz mondo fuso orario libreria di definizioni.

Questa libreria consente calcoli del fuso orario accurati e multipiattaforma utilizzando Python 2.3 o versioni successive. Risolve anche il problema dei tempi ambigui alla fine dell'ora legale, di cui è possibile leggere di più nel Python Library Reference (datetime.tzinfo).

Si avvale della tz database, che dovrebbe includere EDT, e consentono di eseguire i calcoli necessari per (e probabilmente più affidabile & precisione rispetto l'implementazione corrente).

+1

+1 perché 'pytz' è le ginocchia delle api. – jathanism

0

Da Documenti per strptime

supporto per la direttiva% Z si basa sui valori contenuti in tzname e se la luce del giorno è vero. A causa di questo, è specifico della piattaforma eccetto per il riconoscimento di UTC e GMT che sono sempre note (e sono considerate come fusi orari non diurni).

10

Oltre a pytz, controllare python-dateutil. La funzionalità relativedelta è in sospeso.

Ecco un esempio di utilizzo di insieme:

from datetime import datetime 

from dateutil.relativedelta import * 
import pytz 

if __name__ == '__main__': 
    date_one = datetime.now(pytz.timezone('US/Eastern')) 
    date_two = datetime.now(pytz.timezone('US/Mountain')) 
    rdelta = relativedelta(date_one, date_two) 
    print(rdelta) 
+0

questo è falso ... relativedelta non tiene conto dei fusi orari.Ho appena provato e questo mi dà 2 secondi differenza tra Londra e Parigi (2secs = il tempo ho bisogno di digitare la funzione) – dgan