Python DST и обнаружение часового пояса после добавления - PullRequest
7 голосов
/ 21 сентября 2011

Итак, у меня есть строка кода, которая выглядит следующим образом:

        t1 = datetime(self.year, self.month, self.day, self.hour, self.minute, self.second)
        ...
        t2 = timedelta(days=dayNum, hours=time2.hour, minutes=time2.minute, seconds=time2.second)
        sumVal = t1 + t2

Я бы хотел, чтобы в результате были учтены любые аффекты перехода на летнее время, которые могут произойти (например, если я нахожусь в 04.11.2012 00:30 и добавлю 3 часа, я получу 02:30 из-за падение назад для DST). Я рассмотрел использование pytz и python-dateutil, и ни один из них, кажется, не поддерживает это или, по крайней мере, не поддерживает его без отдельного файла, который содержит все часовые пояса. Главное, что время не обязательно должно быть в том же часовом поясе, что и текущая система, или даже в прошлом. Я уверен, что есть простой способ сделать это (или я ожидал бы этого от Python), но, похоже, сейчас мне не нужно ничего. Есть идеи?

1 Ответ

5 голосов
/ 21 сентября 2011

Возможно pytz 'normalize метод, который вы ищете:

import datetime as dt
import pytz

tz=pytz.timezone('Europe/London')
t1 = dt.datetime(2012,10,28,0,30,0)
t1=tz.localize(t1)
t2 = dt.timedelta(hours=3)
sumVal = t1 + t2

sumVal остается в BST:

print(repr(sumVal))
# datetime.datetime(2012, 10, 28, 3, 30, tzinfo=<DstTzInfo 'Europe/London' BST+1:00:00 DST>)

После нормализации sumVal в GMT:

sumVal = tz.normalize(sumVal)
print(repr(sumVal))
# datetime.datetime(2012, 10, 28, 2, 30, tzinfo=<DstTzInfo 'Europe/London' GMT0:00:00 STD>)

Обратите внимание, что для Лондона переход на летнее время происходит в 2012-10-28 02:00:00.

...