Horario de verano de Python

¿Cómo verifico si el horario de verano está vigente?

Puede usar time.localtime y ver el indicador tm_isdst en el valor de retorno.

 >>> import time >>> time.localtime() (2010, 5, 21, 21, 48, 51, 4, 141, 0) >>> _.tm_isdst 0 

Al usar time.localtime() , puede hacer la misma pregunta en cualquier momento arbitrario para ver si DST estaría (o estaba) vigente para su zona horaria actual.

Ampliando la respuesta anterior de @Greg Hewgill, además de sobrellevar la zona horaria local (con la ayuda de pip install tzlocal ), obtienes:

 import time from datetime import datetime, timedelta from tzlocal import get_localzone def to_local(dt): """From any timezone to local datetime - also cope with DST""" localtime = time.localtime() if localtime.tm_isdst: utctime = time.gmtime() hours_delta = timedelta(hours=(localtime.tm_hour - utctime.tm_hour)) dt = dt - hours_delta return dt.replace(tzinfo=get_localzone()) 

La respuesta aceptada está bien si está ejecutando el código en su computadora portátil, pero la mayoría de las aplicaciones de Python se ejecutan en un servidor utilizando UTC como hora local, por lo que NUNCA estarán en horario de verano según la respuesta aceptada.

El segundo problema es que las diferentes regiones implementan el horario de verano en diferentes días y horas. Entonces, incluso si tiene un horario no ambiguo, como datetime.utcnow() , podría ser el horario de verano en una zona horaria pero no en otra.

Lo mejor que podemos hacer entonces es decir si ocurre un tiempo determinado durante el horario de verano para una zona horaria específica, y el mejor método que puedo encontrar para hacerlo ya ha sido implementado por pytz localize function y podemos usarlo para obtener una buena respuesta. Eso funciona tanto en nuestra computadora portátil como en un servidor.

 import pytz from datetime import datetime def is_dst(dt=None, timezone="UTC"): if dt is None: dt = datetime.utcnow() timezone = pytz.timezone(timezone) timezone_aware_date = timezone.localize(dt, is_dst=None) return timezone_aware_date.tzinfo._dst.seconds != 0 

Algunos ejemplos

 >>> is_dst() # it is never DST in UTC False >>> is_dst(datetime(2019, 1, 1), timezone="US/Pacific") False >>> is_dst(datetime(2019, 4, 1), timezone="US/Pacific") True >>> is_dst(datetime(2019, 3, 10, 2), timezone="US/Pacific") NonExistentTimeError >>> is_dst(datetime(2019, 11, 3, 1), timezone="US/Pacific") AmbiguousTimeError 

En nuestra función is_dst , especificamos is_dst=None como un parámetro para timezone.localize , lo que hará que los tiempos sin sentido is_dst=None errores. Podría usar is_dst=False para ignorar estos errores y devolver False en esos momentos.