我正在使用dateutil库来解析一些日期字符串,并得到奇怪的结果。我假设以下日期字符串都是相等的,并且括号中的时区缩写实际上是可选的,但是删除它会得到一个完全不同的值:
import datetime
import dateutil.parser
parsed_d1 = dateutil.parser.parse('Sun May 13 2012 00:00:00 GMT-0400 (EDT)')
parsed_d2 = dateutil.parser.parse('Sun May 13 2012 00:00:00 GMT-0400')
parsed_d3 = dateutil.parser.parse('Sun May 13 2012 00:00:00-0400')
print str(parsed_d1)
print str(parsed_d2)
print str(parsed_d3)
输出:
2012-05-13 00:00:00-04:00
2012-05-13 00:00:00+04:00
2012-05-13 00:00:00-04:00
谁能解释一下这里发生了什么?
EDT代表英国西部的美国。 太阳从东方升起。 所以太阳在美国之前在英国头顶。 因此,您需要在EDT上增加4小时才能获得GMT。 这就是为什么我需要在下午晚些时候打电话给我的父母(在英国(,或者他们躺在床上。 换句话说:"EDT +4 是 GMT"。
现在,此消息的来源在 http://bazaar.launchpad.net/~dateutil/dateutil/trunk/view/head:/dateutil/parser.py,并且似乎与解析GMT-0400
相关的评论说
# Check for something like GMT+3, or BRST+3. Notice
# that it doesn't mean "I am 3 hours after GMT", but
# "my time +3 is GMT". If found, we reverse the
# logic so that timezone parsing code will get it
# right.
这意味着GMT-0400
相当于"我的时间-4是格林威治标准时间"。 这与上面不一样。
此外,如果您查看代码,则会在此之后处理尾随(EDT)
,因此优先处理。 我认为第三种情况,以及最终的简单-0400
按照您的预期进行处理。
换句话说(在我看来,从扫描代码来看(,GMT-0400
表单正在作为代码文档工作,但不是您所期望的。这条线不等同于其他两条线。
我不知道为什么代码是这样工作的;我只是报告我读到的内容。
最后,请注意,该代码中的一般方法是逐块处理整个日期字符串,将不同的逻辑应用于不同的位置。 没有那么多检查来确保不同地方的逻辑是一致的(因此第一行中的明显矛盾不会引发错误(。 就个人而言,我更喜欢使用 Python 自己的日期解析例程但尝试不同格式字符串的库 - 我怀疑这会更可靠(但可能不太灵活(。
更新我忘记了这篇文章,但是在写完这个回复一段时间后,我写了简单的日期来处理时区的解析。 它采用的方法更像我说的我更喜欢 - 它不是试图变得聪明,而是在 Pytz 数据库中搜索匹配项。