Хорошо, позвольте мне сначала начать с того, что мой часовой пояс - CET/CEST. Точный момент, когда он изменяется от CEST до CET (от DST, который равен GMT + 2, до нормального, который GMT + 1, таким образом) всегда является последним воскресеньем октября в 3 часа ночи. В 2010 году это было 31 октября 3AM.
Теперь обратите внимание на следующее:
>>> import datetime
>>> import pytz.reference
>>> local_tnz = pytz.reference.LocalTimezone()
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 3600)
Это неправильно, как описано выше.
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 30, 2, 12, 30))
datetime.timedelta(0, 7200)
>>> local_tnz.utcoffset(datetime.datetime(2010, 10, 31, 2, 12, 30))
datetime.timedelta(0, 7200)
Теперь это внезапно правильно:/
Я знаю, что есть несколько вопросов об этом уже, но данное решение всегда "использует локализацию", но моя проблема здесь в том, что LocalTimezone не предоставляет этот метод.
Фактически, у меня есть несколько временных меток в миллисекундах, из которых мне нужен utcoffset локального часового пояса (не только мой, но и любой, кто использует программу). Один из них - 1288483950000 или Sun Oct 31 2010 02:12:30 GMT + 0200 (CEST) в моем часовом поясе.
В настоящее время я делаю следующее, чтобы получить объект datetime:
datetime.datetime.fromtimestamp(int(int(millis)/1E3))
и для получения utcoffset в минутах:
-int(local_tnz.utcoffset(date).total_seconds()/60)
который, к сожалению, во многих случаях ошибочен: (.
Любые идеи?
Примечание. Я использую python3.2.4, а не то, что в этом случае это имеет значение.
EDIT:
Нашел решение благодаря @JamesHolderness:
def datetimeFromMillis(millis):
return pytz.utc.localize(datetime.datetime.utcfromtimestamp(int(int(millis)/1E3)))
def getTimezoneOffset(date):
return -int(date.astimezone(local_tz).utcoffset().total_seconds()/60)
С local_tz, равным tzlocal.get_localzone() из модуля tzlocal.