2012-06-12 66 views
37

Busco a una forma rápida de escribir en un tiempo y luego pitón convertirlo en otras zonas horarias (tal vez hasta 10 zonas horarias diferentes)Python Zona horaria conversión

Lo sentimos. No estoy familiarizado con el tiempo en Python en absoluto, si alguien pudiera ponerme en la dirección correcta, realmente lo apreciaría.

Respuesta

38

Usando 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: imprime * momentos de tiempo * diferentes en * zonas horarias * diferentes. OP pregunta por ** el mismo ** momento de tiempo en diferentes zonas horarias. – jfs

49

He encontrado que el mejor enfoque es convertir el "momento" de interés a un objeto datetime con utc-timezone (en python, el componente de zona horaria no es necesario para objetos datetime).

Luego puede usar astimezone para convertir a la zona horaria de interés (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 

Así, con el momento de su interés en la zona horaria local (una vez que exists), se lo convierte a UTC como esto (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

tenga cuidado, la hora local puede ser ambigua y la cadena dada puede no corresponder a ningún tiempo existente, por ejemplo, debido a las transiciones DST. Proporcione 'localize (is_dst = None)' si desea generar una excepción en tales casos. – jfs

+0

Gracias, edité la respuesta. – juan

+0

Código actualizado (python 3, zonas horarias). – juan

2

Para Python 3.2+ simple-date es una envoltura alrededor de pytz que trata de simplificar las cosas.

Si usted tiene un time continuación

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

puede hacer lo que quiera. Pero las zonas horarias son cosas bastante complejas, por lo que puede ser mucho más complicado: consulte the docs.

5

Para convertir un tiempo en una zona horaria a otra zona horaria en Python, usted podría use datetime.astimezone():

time_in_new_timezone = time_in_old_timezone.astimezone(new_timezone) 

Dada aware_dt (un objeto datetime en alguna zona horaria), para convertirlo en otras zonas horarias y la impresión de los tiempos en un formato de tiempo determinado:

#!/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}}") 

Si f"" sintaxis no está disponible, usted podría reemplazarlo con "".format(**vars())

donde se podía establecer aware_dt de la hora actual en la zona horaria local:

from datetime import datetime 
import tzlocal # $ pip install tzlocal 

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

O de la cadena de tiempo de entrada en la zona horaria local:

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

donde time_string podría parecerse a: '2016-11-19 02:21:42'. Corresponde al time_format = '%Y-%m-%d %H:%M:%S'.

is_dst=None fuerza una excepción si la cadena de tiempo de entrada corresponde a una hora local no existente o ambigua, como durante una transición DST. También puede pasar is_dst=False, is_dst=True.Ver enlaces con más detalles en 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: Fecha de cadena de tiempo
  • tz1: tiempo inicial zona
  • tz2: diana zona horaria

-

> 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

espero que no estoy demasiado tarde!

La biblioteca pendulum sobresale en este y otros cálculos de fecha y hora.

>>> 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 enumera los nombres de las zonas de tiempo que pueden ser utilizados con péndulo. (Son los mismos que para pytz.)

Cuestiones relacionadas