pytz: conversión de UTC y zona horaria a hora local

Tengo una datetime y datetime en la zona horaria de 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?

Creo que lo tengo:

 pytz.utc.localize(utc_time, is_dst=None).astimezone(tz) 

En primer lugar, esta línea convierte el objeto utc_time datetime naive (zona horaria inconsciente) en un objeto datetime que contiene una zona horaria (UTC). Luego utiliza la función astimezone para ajustar la hora según la zona horaria solicitada.

¿Puedo recomendar el uso de la flecha ? Si entendiera la pregunta:

 >>> import arrow >>> utc = arrow.utcnow() >>> utc  >>> local = utc.to("America/St_Johns") >>> local  

También puedes usar

 tz.fromutc(utc_time) 

Estoy de acuerdo con la respuesta de Tzach. Solo quería incluir que el parámetro is_dst no es necesario:

 pytz.utc.localize(datetime.utcnow()).astimezone(tz) 

Ese código convierte la hora UTC actual en una fecha y hora actual que tiene en cuenta la zona horaria.

Mientras que el código a continuación convierte la hora UTC actual en una fecha y hora reconocida de la zona horaria que no es necesariamente actual. La zona horaria simplemente se añade al valor de hora UTC.

 tz.localize(datetime.utcnow()) 

Es el propósito exacto de la función fromutc :

 tz.fromutc(utc_time) 

( as_timezone función as_timezone llama a fromutc debajo del capó, pero primero intenta convertir a UTC, lo que no es necesario en su caso)

Otra forma muy fácil:

Debido a que el método utcnow devuelve un objeto ingenuo , tiene que convertir el objeto ingenuo en un 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 de fecha y hora 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) 

También puedes usar la muestra de abajo, yo la uso para tareas similares

 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 es necesario importar bibliotecas adicionales.