好吧,这是我遇到过的最奇怪的错误之一!
首先:我不是 Python 程序员,该脚本是由 friend 编写的(我认为他的大部分内容来自示例)。
该脚本的用途:将日历信息(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 (例如:欧洲/斯德哥尔摩
)而不是CET
或CEST
。
此外,您应该注意 summer time begins in Europe on March 29, 2015 。由于您的一些日期是在更改之前,有些是在更改之后,因此您确实会有一些在 CET 中,一些在 CEST 中。
关于Python 在运行时更改变量/时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29016724/