2012-06-12 34 views
37

Cerco un modo rapido per digitare in un tempo e poi python convertirlo in altri fusi orari (forse fino a 10 fusi orari diversi)Python Fuso orario conversione

spiacenti. Non sono affatto familiare con il tempo in python, se qualcuno potesse mettermi nella giusta direzione lo apprezzerei molto.

risposta

38

Utilizzando pytz

from datetime import datetime 
from pytz import timezone 

fmt = "%Y-%m-%d %H:%M:%S %Z%z" 
timezonelist = ['UTC','US/Pacific','Europe/Berlin'] 
for zone in timezonelist: 

    now_time = datetime.now(timezone(zone)) 
    print now_time.strftime(fmt) 
+8

nota: stampa * diversi * momenti temporali in * diversi * fusi orari. OP chiede circa ** lo stesso ** momento in diversi fusi orari. – jfs

49

Ho trovato che l'approccio migliore è convertire il "momento" di interesse in un oggetto datetime utc-timezone-aware (in python, il componente timezone non è richiesto per gli oggetti datetime).

Quindi è possibile utilizzare astimezone per convertire nel fuso orario di interesse (reference).

from datetime import datetime 
import pytz 

utcmoment_naive = datetime.utcnow() 
utcmoment = utcmoment_naive.replace(tzinfo=pytz.utc) 

# print "utcmoment_naive: {0}".format(utcmoment_naive) # python 2 
print("utcmoment_naive: {0}".format(utcmoment_naive)) 
print("utcmoment:  {0}".format(utcmoment)) 

localFormat = "%Y-%m-%d %H:%M:%S" 

timezones = ['America/Los_Angeles', 'Europe/Madrid', 'America/Puerto_Rico'] 

for tz in timezones: 
    localDatetime = utcmoment.astimezone(pytz.timezone(tz)) 
    print(localDatetime.strftime(localFormat)) 

# utcmoment_naive: 2017-05-11 17:43:30.802644 
# utcmoment:  2017-05-11 17:43:30.802644+00:00 
# 2017-05-11 10:43:30 
# 2017-05-11 19:43:30 
# 2017-05-11 13:43:30 

Così, con il momento di interesse per il fuso orario locale (un tempo che exists), si converte a UTC come questo (reference).

localmoment_naive = datetime.strptime('2013-09-06 14:05:10', localFormat) 

localtimezone = pytz.timezone('Australia/Adelaide') 

try: 
    localmoment = localtimezone.localize(localmoment_naive, is_dst=None) 
    print("Time exists") 

    utcmoment = localmoment.astimezone(pytz.utc) 

except pytz.exceptions.NonExistentTimeError as e: 
    print("NonExistentTimeError") 
+6

Attenzione, l'ora locale potrebbe essere ambigua e la stringa data potrebbe non corrispondere a qualsiasi ora esistente, ad es. A causa di transizioni DST. Fornire 'localize (is_dst = None)' se si desidera generare un'eccezione in questi casi. – jfs

+0

Grazie ho modificato la risposta. – juan

+0

Codice aggiornato (python 3, fusi orari). – juan

2

Per Python 3.2+ simple-date è un wrapper pytz che cerca di semplificare le cose.

Se si dispone di un time poi

SimpleDate(time).convert(tz="...") 

può fare quello che vuoi. Ma i fusi orari sono cose piuttosto complesse, quindi può diventare molto più complicato: vedere lo the docs.

5

Per convertire un tempo in una fuso orario ad un altro fuso orario in Python, si potrebbe use datetime.astimezone():

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone) 

Dato aware_dt (un oggetto datetime in qualche fuso orario), per convertirlo in altri fusi orari e per stampare i tempi in un determinato formato di tempo:

#!/usr/bin/env python3 
import pytz # $ pip install pytz 

time_format = "%Y-%m-%d %H:%M:%S%z" 
tzids = ['Asia/Shanghai', 'Europe/London', 'America/New_York'] 
for tz in map(pytz.timezone, tzids): 
    time_in_tz = aware_dt.astimezone(tz) 
    print(f"{time_in_tz:{time_format}}") 

Se f"" sintassi non è disponibile, è possibile sostituirlo con "".format(**vars())

dove si poteva impostare aware_dt dal momento in corrente nel fuso orario locale:

from datetime import datetime 
import tzlocal # $ pip install tzlocal 

local_timezone = tzlocal.get_localzone() 
aware_dt = datetime.now(local_timezone) # the current time 

O dalla stringa tempo di ingresso nel fuso orario locale:

naive_dt = datetime.strptime(time_string, time_format) 
aware_dt = local_timezone.localize(naive_dt, is_dst=None) 

dove time_string potrebbe apparire come: '2016-11-19 02:21:42'. Corrisponde a time_format = '%Y-%m-%d %H:%M:%S'.

is_dst=None forza un'eccezione se la stringa del tempo di ingresso corrisponde a un orario locale non esistente o ambiguo come durante una transizione dell'ora legale. Potresti anche passare is_dst=False, is_dst=True.Vedere i collegamenti con maggiori dettagli in Python: How do you convert datetime/timestamp from one timezone to another timezone?

2
import datetime 
import pytz 

def convert_datetime_timezone(dt, tz1, tz2): 
    tz1 = pytz.timezone(tz1) 
    tz2 = pytz.timezone(tz2) 

    dt = datetime.datetime.strptime(dt,"%Y-%m-%d %H:%M:%S") 
    dt = tz1.localize(dt) 
    dt = dt.astimezone(tz2) 
    dt = dt.strftime("%Y-%m-%d %H:%M:%S") 

    return dt 

-

  • dt: Data di stringa di tempo
  • tz1: tempo iniziale zona
  • tz2: bersaglio fuso orario

-

> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "PST8PDT") 
'2017-05-13 05:56:32' 

> convert_datetime_timezone("2017-05-13 14:56:32", "Europe/Berlin", "UTC") 
'2017-05-13 12:56:32' 

-

> pytz.all_timezones[0:10] 
['Africa/Abidjan', 
'Africa/Accra', 
'Africa/Addis_Ababa', 
'Africa/Algiers', 
'Africa/Asmara', 
'Africa/Asmera', 
'Africa/Bamako', 
'Africa/Bangui', 
'Africa/Banjul', 
'Africa/Bissau'] 
0

Spero di non essere troppo tardi!

La libreria pendulum eccelle a questo e ad altri calcoli di data e ora.

>>> import pendulum 
>>> some_time_zones = ['Europe/Paris', 'Europe/Moscow', 'America/Toronto', 'UTC', 'Canada/Pacific', 'Asia/Macao'] 
>>> heres_a_time = '1996-03-25 12:03 -0400' 
>>> pendulum_time = pendulum.datetime.strptime(heres_a_time, '%Y-%m-%d %H:%M %z') 
>>> for tz in some_time_zones: 
...  tz, pendulum_time.astimezone(tz) 
...  
('Europe/Paris', <Pendulum [1996-03-25T17:03:00+01:00]>) 
('Europe/Moscow', <Pendulum [1996-03-25T19:03:00+03:00]>) 
('America/Toronto', <Pendulum [1996-03-25T11:03:00-05:00]>) 
('UTC', <Pendulum [1996-03-25T16:03:00+00:00]>) 
('Canada/Pacific', <Pendulum [1996-03-25T08:03:00-08:00]>) 
('Asia/Macao', <Pendulum [1996-03-26T00:03:00+08:00]>) 

Answer elenca i nomi dei fusi orari che possono essere utilizzati con pendolo. (Sono uguali a pytz.)

Problemi correlati