python - mexico - pytz-Conversión de UTC y zona horaria a hora local
pytz timezone mexico (6)
Tengo una datetime
y datetime
en la zona horaria utc, por ejemplo:
utc_time = datetime.datetime.utcnow()
Y un objeto de zona horaria pytz:
tz = timezone(''America/St_Johns'')
¿Cuál es la forma correcta de convertir utc_time
a la zona horaria dada?
¿Puedo recomendar usar la flecha ? Si entendí la pregunta:
>>> import arrow
>>> utc = arrow.utcnow()
>>> utc
<Arrow [2014-08-12T13:01:28.071624+00:00]>
>>> local = utc.to("America/St_Johns")
>>> local
<Arrow [2014-08-12T10:31:28.071624-02:30]>
También puedes usar
tz.fromutc(utc_time)
Otra forma muy sencilla:
Como el método utcnow
devuelve un objeto ingenuo , debe convertir el objeto ingenuo en objeto consciente . Usando el método de replace
puede convertir un objeto ingenuo en un objeto consciente . Luego puede usar el método astimezone
para crear un nuevo objeto datetime en una zona horaria diferente.
from datetime import datetime
import pytz
utc_time = datetime.utcnow()
tz = pytz.timezone(''America/St_Johns'')
utc_time =utc_time.replace(tzinfo=pytz.UTC) #replace method
st_john_time=utc_time.astimezone(tz) #astimezone method
print(st_john_time)
Creo que lo tengo:
pytz.utc.localize(utc_time, is_dst=None).astimezone(tz)
Esta línea primero convierte el objeto datetime
utc_time
ingenuo (zona horaria desconocida) en un objeto datetime
que contiene una zona horaria (UTC). Luego utiliza la función astimezone
para ajustar el tiempo de acuerdo con la zona horaria solicitada.
Es el propósito exacto de la función fromutc
:
tz.fromutc(utc_time)
(la función as_timezone
llama fromutc
bajo el capó, pero primero intenta convertir a UTC, lo que no es necesario en su caso)
Estoy de acuerdo con la respuesta de Tzach. Solo quería incluir que el parámetro is_dst no es obligatorio:
pytz.utc.localize(datetime.utcnow()).astimezone(tz)
Ese código convierte la hora UTC actual a una hora actual con fecha actual.
Mientras que el código a continuación da a las conversiones la hora UTC actual a una fecha y hora de fecha estimada que no es necesariamente actual. La zona horaria se anexa al valor de tiempo UTC.
tz.localize(datetime.utcnow())
También puede usar la muestra a continuación, la uso para una tarea similar
tz = pytz.timezone(''America/St_Johns'')
time_difference=tz.utcoffset(utc_time).total_seconds() #time difference between UTC and local timezones in 5:30:00 format
utc_time = date + timedelta(0,time_difference)
Funciona rápido y no necesita importar bibliotecas adicionales.