Летнее время Python - PullRequest
38 голосов
/ 21 мая 2010

Как проверить, действует ли летнее время?

Ответы [ 3 ]

60 голосов
/ 21 мая 2010

Вы можете использовать time.localtime и посмотреть флаг tm_isdst в возвращаемом значении.

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

Используя time.localtime(), вы можете задать один и тот же вопрос в любое произвольное время, чтобы увидеть, будет ли DST действовать (или был) в вашем текущем часовом поясе.

5 голосов
/ 17 апреля 2019

Принятый ответ подходит, если вы запускаете код на своем ноутбуке, но большинство Приложения 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 для тех, раз.

0 голосов
/ 11 апреля 2018

Расширяя ответ @Greg Hewgill выше, плюс справляясь с местным часовым поясом (с помощью pip install tzlocal), вы получаете:

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())
...