Летнее время Python

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

Ответ 1

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

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

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

Ответ 2

Развернув ответ @Greg Hewgill выше, плюс справившись с местным pip install tzlocal (с помощью 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())

Ответ 3

Принятый ответ подходит, если вы запускаете код на своем ноутбуке, но большинство приложений python работают на сервере, использующем UTC в качестве локального времени, поэтому они НИКОГДА не будут переходить на летнее время в соответствии с принятым ответом.

Вторая проблема заключается в том, что разные регионы используют летнее время в разные дни и часы. Таким образом, даже если у вас есть однозначное время, например datetime.utcnow(), это может быть переход на летнее время в одном часовом поясе, но не в другом.

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

Ответ 4

Если вы хотите проверить, действует ли дневной свет с текущими настройками компьютера, используйте time.daylight.

>>> import time
>>> print time.daylight

time.daylight только указывает, находится ли компьютер в настоящее время в летнее время, а не в случае, если на компьютере установлена ​​ "Автоматическая настройка часов для перехода на летнее время". Для тех компьютеров, которые не настроены на регулировку дневного света, time.daylight всегда будет 0 круглый год.

Один из способов определить, будет ли компьютер настраиваться на летнее время в течение года, - это получить кортеж, возвращенный time.tzname, и если они являются различиями (например, len (set (time.tzname))!= 1), тогда компьютер включит регулировку дневного света.