Хорошо, позвольте мне сначала начать с того, что мой часовой пояс - CET/CEST. Точный момент, когда он изменяется от CEST до CET (от DST, который равен GMT + 2, до нормального, который GMT + 1, таким образом) всегда является последним воскресеньем октября в 3 часа ночи. В 2010 году это было 31 октября 3AM.Получение правильного смещения часового пояса в Python с использованием местного часового пояса
Теперь обратите внимание на следующее:
>>> 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, не то, что в этом случае это имеет значение.
РЕДАКТИРОВАТЬ:
нашел решение благодаря @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.
Используя Python 2.7.5 и pytz 2013b, я получаю разные и последовательные результаты: 'datetime.timedelta (0, 3600)'. 'datetime.timedelta (0, 7200)' и 'datetime.timedelta (0, 3600)' соответственно. Я поставил свой часовой пояс на CET перед началом теста. – martineau
Попробуйте вручную перейти через строки в utcoffset и _isdst на cli, см. Код здесь: http://bazaar.launchpad.net/~stub/pytz/devel/view/head:/src/pytz/reference .py Посмотрите, видите ли вы что-то не так. – ojs
Связанный: [Получение UTC UTC в Python] (http://stackoverflow.com/q/3168096/4279) – jfs