2015-03-12 2 views
1

Хорошо, это одна из самых странных ошибок, с которыми я столкнулся!Python меняет переменную/часовой пояс во время работы?

Во-первых: Я не программист на Python, а сценарий написан другом (который, как я думаю, взял большую часть из примера).

Цель сценария: Для разбора календаря информации (раз в СЕТ) из XML-файла в качестве ИКС-файл, чтобы люди могли добавить его в свои Google календари и т.д. (файлы постоянно обновляются).

Проблема, которую я попытался исправить: Сделать это импортировать в календарь Google правильно (с корректным разом и т.д.)

Что я сделал: Изменена преобразование времени включить часовые пояса.

Странная проблема: При выполнении часовой пояс изменяется от CET до CEST (в том же самом случае, насколько я вижу). Переменная, которая содержит часовой пояс, назначается только один раз (перед циклом, который проходит через события), поэтому я не могу в своей жизни выяснить, что вызывает проблему!

Часть выхода:

BEGIN:VEVENT 
SUMMARY:Ungdomsaktivitet 
DTSTART;TZID=CET;VALUE=DATE-TIME:20150327T193000 
DTEND;TZID=CET;VALUE=DATE-TIME:20150327T193000 
LOCATION:Kaj 
END:VEVENT 
BEGIN:VEVENT 
SUMMARY:Ungdomsmöte 
DTSTART;TZID=CET;VALUE=DATE-TIME:20150328T193000 
DTEND;TZID=CET;VALUE=DATE-TIME:20150328T193000 
DESCRIPTION:Ekumeniskt ungdomsmöte mellan Skara\, Götene & Lidköping. S 
amuel Östersjö predikar\, Elias Olofsson med team leder lovsång. 
LOCATION:Pingstkyrkan\, Lidköping 
END:VEVENT 
BEGIN:VEVENT 
SUMMARY:Bön 
DTSTART;TZID=CEST;VALUE=DATE-TIME:20150329T100000 
DTEND;TZID=CEST;VALUE=DATE-TIME:20150329T100000 
LOCATION:Pingstkyrkan\, Lidköping 
END:VEVENT 
BEGIN:VEVENT 
SUMMARY:Gudstjänst 
DTSTART;TZID=CEST;VALUE=DATE-TIME:20150329T110000 
DTEND;TZID=CEST;VALUE=DATE-TIME:20150329T110000 
DESCRIPTION:Evangelicenter 
LOCATION:Pingstkyrkan\, Lidköping 
END:VEVENT 
BEGIN:VEVENT 
SUMMARY:Ekumenisk bön 
DTSTART;TZID=CEST;VALUE=DATE-TIME:20150331T100000 
DTEND;TZID=CEST;VALUE=DATE-TIME:20150331T100000 
DESCRIPTION:i Baptistkyrkan 
LOCATION:Baptistkyrkan\, Lidköping 
END:VEVENT 

код, который имеет дело с временем:

lt = LocalTimezone() 

# [...] 

d = datetime.strptime(dateStr, "%Y-%m-%d") 
t = datetime.strptime(timeStr, "%H:%M:%S").time() 
event.add('dtstart', datetime.combine(d,t).replace(tzinfo=lt)) 
event.add('dtend', datetime.combine(d,t).replace(tzinfo=lt)) 

Полный код:http://pastebin.com/Gf68BWc2

Я рад для всех идей, которые я могу почини это!

+0

Не используйте 'LocalTimezone()'; он основан на модуле 'time' и поэтому может провалиться в некоторых часовых поясах. Использовать 'tzlocal.get_localzone()' вместо этого.] (Https://pypi.python.org/pypi/tzlocal) – jfs

+0

несвязанный: некоторые библиотеки календарей по своей природе ошибочны и ожидают, что все объекты datetime находятся в UTC, даже если вы передадите (с привязанным часовым поясом). Преобразуйте в/из UTC, если необходимо. – jfs

ответ

2

Если lt является pytz часовой пояс, то вам, вероятно, нужно изменить свой код от этого:

datetime.combine(d,t).replace(tzinfo=lt) 

Для этого:

lt.localize(datetime.combine(d,t)) 

Вы, вероятно, следует также использовать full time zone name (например: Europe/Stockholm) вместо CET или CEST.

Кроме того, вы должны знать, что summer time begins in Europe on March 29, 2015. Поскольку некоторые из ваших дат до изменения, а некоторые - после, у вас действительно есть некоторые в CET, а некоторые в CEST.

+1

Стоит отметить, что CET неоднозначен, например, «Европа/Калининград» отличается от «Европа/Варшава» – jfs

+0

Спасибо, теперь эта часть работает правильно! Да, я забыл о ДСТ. Время от источника (в основном) одинаковое раз в неделю и простой экспорт в XML как «метка времени/строка». Таким образом, никакая часть «цепочки» не заботится о DST и т. Д. Теперь мне просто нужно выяснить, почему календарь Google сначала импортирует время правильно, но затем они исчезают .. – ChrisH

Смежные вопросы