【问题标题】:Strange date parsing results in PythonPython中奇怪的日期解析结果
【发布时间】:2012-05-21 11:59:55
【问题描述】:

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

谁能解释这里发生了什么?

【问题讨论】:

  • 第一个和最后一个是一样的,所以问题只是第二个不同?
  • 正确-第二个是麻烦
  • 您使用的是哪个版本?可能是库中的错误,您检查错误报告了吗?我记得 php lib 遇到过这种类型的问题,结果发现时区解析器有问题
  • 我注意到您将 EDT 放在第一个日期时间字符串的末尾。那是您/您的计算机当前设置的位置吗?我认为您不需要 GMT。
  • 我的结果不同,相同的代码:2012-05-13 00:00:00+04:00 2012-05-13 00:00:00+04:00 2012-05-13 00:00:00-04:00

标签: python datetime timezone python-dateutil


【解决方案1】:

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 自己的日期解析例程的库,但尝试不同的格式字符串 - 我怀疑这会更可靠(但可能不太灵活)。

更新我忘记了这篇文章,但在写完这篇回复后不久,我写了simple-date 来处理时区解析。它采用了一种更像我所说的我更喜欢的方法 - 它不是试图变得聪明,而是在 pytz 数据库中搜索匹配项。

【讨论】:

  • 某事能有多丑!
  • @cacba 如果您使用的是 python 3,您可能更喜欢我写的 simple-date 来尝试简化这一点。虽然它并不像我希望的那么简单 - 但问题却是一个难题。
  • 我得出的结论是没有通用的解决方案。 EST 是两个时区。日期时间解析被破坏。
  • python 日期时间让我想念 java docs.oracle.com/javase/7/docs/api/java/text/…。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多