Python 改变 variable/timezone 而 运行?
Python changes variable/timezone while running?
好的,这是我遇到的最奇怪的错误之一!
首先:我不是 Python 程序员,脚本是朋友写的(我认为他从一个例子中获取了大部分内容)。
脚本的目的:将日历信息(CET 时间)从 XML 文件解析为 ics 文件,以便人们可以添加它他们的 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
我很高兴能得到所有关于如何解决这个问题的想法!
如果 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 中。
好的,这是我遇到的最奇怪的错误之一!
首先:我不是 Python 程序员,脚本是朋友写的(我认为他从一个例子中获取了大部分内容)。
脚本的目的:将日历信息(CET 时间)从 XML 文件解析为 ics 文件,以便人们可以添加它他们的 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
我很高兴能得到所有关于如何解决这个问题的想法!
如果 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 中。