奇怪的日期解析结果在Python中

3

我正在使用 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  

有人能解释一下这里发生了什么吗?


第一个和最后一个是相同的,所以问题只在于第二个不同吗? - Levon
正确-第二个是问题所在。 - Yarin
你使用的是哪个版本?可能是库中的一个错误,你有检查过错误报告吗?我记得在使用一个 PHP 库时遇到过这种问题,结果发现时区解析器有 bug。 - Philippe
我注意到你在第一个日期时间字符串结尾处放置了EDT。那是你/你的电脑当前设置的时区吗?我觉得你不需要GMT。 - Chad Stewart
@Chad- 我正在尝试理解是日期字符串格式有问题还是库有问题。 - Yarin
1
我的结果不同,尽管代码相同: 2012-05-13 00:00:00+04:00 2012-05-13 00:00:00+04:00 2012-05-13 00:00:00-04:00 - heltonbiker
1个回答

3

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是GMT",这与上面的情况不同。此外,如果你查看代码,一个尾随的(EDT)被处理在此之后,并且具有更高的优先级。我认为第三种情况,即最终的简单-0400,会按照您的预期进行处理。换句话说(根据我扫描代码的结果),GMT-0400形式是按照代码文档工作的,但不是您所期望的。该行与其他两行不等效。我不知道为什么代码会以这种方式工作;我只是报告我读到的内容。最后,请注意,在该代码中的一般方法是逐个处理整个日期字符串块,对不同的位置应用不同的逻辑。没有太多检查以确保不同位置的逻辑是一致的(因此第一行存在明显矛盾时不会抛出错误)。就个人而言,我更喜欢使用Python自己的日期解析程序库,并尝试不同的格式字符串——我认为这可能更可靠(但也许不那么灵活)。更新 我已经忘记了这篇文章,但在写完这篇回复后不久,我写了simple-date来处理时区解析。它采用了我所说的更喜欢的方法——而不是试图聪明,它搜索与pytz数据库匹配的结果。

多丑的东西啊! - cacba
如果你正在使用Python 3,你可能更喜欢我写的simple-date来尝试简化这个问题。虽然它并不像我希望的那么简单 - 问题实际上是一个难题。 - andrew cooke
我得出的结论是,这个问题没有通用解决方案。EST有两个时区。日期时间解析存在问题。 - cacba
Python datetime 让我想念 Java 的 SimpleDateFormat。 - wanghq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接