Принятый ответ подходит, если вы запускаете код на своем ноутбуке, но большинство
Приложения Python работают на сервере, используя UTC как местное время, поэтому они
НИКОГДА не будет в летнее время в соответствии с принятым ответом.
Вторая проблема заключается в том, что разные регионы используют летнее время на
разные дни и времена. Так что даже если у вас есть однозначное время, такое как
datetime.utcnow()
, это может быть летнее время в одном часовом поясе, но не
в другом.
Лучшее, что мы можем сделать, это определить, происходит ли определенное время во время летнего времени для
конкретный часовой пояс, и лучший метод, который я могу найти для этого, уже
была реализована функцией pytz localize
, и мы можем использовать ее, чтобы получить
довольно хороший ответ, который работает как на нашем ноутбуке, так и на сервере.
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
Некоторые примеры
>>> 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
В нашей функции is_dst
мы указали is_dst=None
в качестве параметра
timezone.localize
, что приведет к бессмысленным ошибкам. Вы
может использовать is_dst=False
, чтобы игнорировать эти ошибки и вернуть False
для тех,
раз.