我读了很多关于解析时间有多不稳定的文章。我相信我已经想出了一种可靠的方法来转换ISO8601格式的时间戳:
https://gist.github.com/3702066
最重要的部分是解析日期时的astimezone(LOCALZONE)
调用。这允许time.mktime()做正确的事情,并且似乎可以正确地处理夏令时。
有没有我错过的明显机会?
即使在夏令时转换之前或之后,您的代码似乎也能运行,但我担心,在极少数情况下,当一个位置的时区偏移量实际发生变化时,它可能仍然会失败。不过我没有一个可以测试的例子。
因此,即使if确实有效(或者几乎总是有效),我认为以任何方式涉及或通过本地时间的方式将UTC时间字符串转换为UTC时间戳都是疯狂的。本地时区应该是不相关的。这是一种不必要的依赖。我并不是说你疯了。您只是在尝试使用给定的API,而C库的时间API设计得很糟糕。
幸运的是,Python提供了mktime()
的替代方案,这也是C库应该提供的:calendar.timegm()
。有了这个函数,我可以像这样重写你的函数:
parsed = parse_date(timestamp)
timetuple = parsed.timetuple()
return calendar.timegm(timetuple)
由于不涉及本地时间,这也消除了对pytz的依赖,以及对某人本地时区的模糊人工制品会造成不必要影响的挥之不去的怀疑。