es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La zona horaria en Python tiene un desplazamiento de un par de minutos.

from pytz import timezone

import datetime
utc = datetime.timezone.utc

tz = timezone("Europe/London")
now = datetime.datetime.now(utc)
date = now.replace(tzinfo=tz)
date_utc = date.astimezone(utc)

print(now.isoformat())
print(date.isoformat())
print(date_utc.isoformat())

Puede imprimir:

2021-12-01T21:30:09.170108+00:00
2021-12-01T21:30:09.170108-00:01   <---- ¿Por qué muestra -00:01 aquí?
2021-12-01T21:31:09.170108+00:00

¿Por qué hay un desfase de un minuto?
¿Estoy perdiéndome algún conocimiento fundamental sobre zonas horarias?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible que te falte conocimiento fundamental sobre las zonas horarias.

    El atributo tzinfo de un objeto datetime.datetime no admite zonas horarias de manera robusta. Específicamente, no se ajusta para el horario de verano u otros cambios históricos en las zonas horarias.

    Para manejar correctamente las zonas horarias, se debe utilizar la biblioteca pytz. En el código de ejemplo, la variable tz se establece en timezone ("Europe/London"), que representa la zona horaria para Londres, Reino Unido.

    Cuando se imprime date utilizando el método isoformat(), muestra un desplazamiento de un minuto porque el método replace() establece la zona horaria en tz, que está en UTC +00:00, pero la zona horaria real para Londres el 1 de diciembre de 2021 fue UTC +01:00 debido al horario de verano. Esto significa que la hora debe retroceder 1 hora para reflejar la hora correcta en Londres.

    Para solucionar este problema, puede utilizar el método localize() de pytz, que se encarga de ajustar los cambios históricos en las zonas horarias. Aquí hay una versión actualizada del código que muestra correctamente la hora en Londres:

    from pytz import timezone, utc
    import datetime
    
    london_tz = timezone("Europe/London")
    
    # Obtener la hora actual en UTC
    now_utc = datetime.datetime.now(utc)
    
    # Convertir a la hora de Londres e imprimir
    now_london = utc.localize(now_utc).astimezone(london_tz)
    print(now_london.isoformat())
    

    Esto debería imprimir la hora correcta para Londres, teniendo en cuenta el horario de verano y otros cambios históricos en la zona horaria.

Comments are closed.