2016-01-08 3 views
1

С этим я боюсь уже несколько часов. Код намного больше, чем пример, который я предоставляю здесь, но он сводится к следующему:Неправильный часовой пояс? 30мин вместо 1 часа

У меня есть объект datetime, который наивен, и я хочу преобразовать его в UTC, но это не работает. ожидается.

import datetime 
import pytz 

# Following is a naive datetime object, but we know the user meant 
# timezone Europe/Zurich 

zurich = datetime.datetime(2016, 1, 8, 7, 10) 
# datetime.datetime(2016, 1, 8, 7, 10) 

# So I'm now converting it to a datetime object which is aware of the 
# timezone 

zurich = zurich.replace(tzinfo=pytz.timezone('Europe/Zurich')) 
# datetime.datetime(2016, 1, 8, 7, 10, tzinfo=<DstTzInfo 'Europe/Zurich' BMT+0:30:00 STD>) 

# Let's convert to UTC 

zurich = zurich.astimezone(pytz.utc) 
# datetime.datetime(2016, 1, 8, 6, 40, tzinfo=<UTC>) 

Смещение Цюрих по сравнению с временем UTC составляет +01: 00 (переход на летнее время) или +02: 00 (Летнее время). Почему Python думает, что это +00: 30 ?!

Любая помощь очень ценится (я уже начинаю вытягивать свои волосы).

+0

Нашел в документации здесь: [Http: //pytz.sourceforge .net/# example-usage] (http://pytz.sourceforge.net/#example-usage) К сожалению, использование аргумента tzinfo стандартных конструкторов datetime «не работает» с pytz для многих часовых поясов. – Daniel

+0

Он не может работать, и даже синтаксиса недостаточно, потому что временной континент Continent/City нельзя скрыть без знания, если он находится в режиме DST или STD. Поэтому необходимо вызвать интеллектуальную функцию из pytz, которая получает время и зону, применяет текущие правила управления и настраивает зону на «CET + 1: 00 STD» или «CEST + 2: 00 DST». Стандартные методы datetime не имеют обратного вызова для tzinfo для его настройки, и даже патметр 'is_dst' должен использоваться за час до и после изменения точки от DST до STD, чтобы преобразовать время однозначно. – hynekcer

ответ

0

Я нашел this ответ на аналогичный вопрос, и если я переписать код этого другого пути, он, кажется, обратиться Вашему запросу

import datetime 
import pytz 
zurich = pytz.timezone('Europe/Zurich').localize(datetime.datetime(2016,1,8,7,10), is_dst=None) 
zurich = zurich.astimezone(pytz.utc) 
# datetime.datetime(2016, 1, 8, 6, 10, tzinfo=<UTC>) 
Смежные вопросы