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