python中的Dateutil解析错误返回了错误的值

python中的Dateutil解析错误返回了错误的值,python,python-2.7,parsing,python-dateutil,Python,Python 2.7,Parsing,Python Dateutil,我已经研究了很多可能的方法来解析python时间。但是使用parse.parse会错误地识别时区 我分析了Fri Nov 9 09:04:02 2012-0500和Fri Nov 9 09:04:02 2012-0800,得到了unix时间中完全相同的时间戳1352480642 我的python 2.7.10版本 dateutil 1.5的我的版本 这是我运行测试的代码 #!/usr/bin/python import time from dateutil import parser de

我已经研究了很多可能的方法来解析python时间。但是使用parse.parse会错误地识别时区

我分析了
Fri Nov 9 09:04:02 2012-0500
Fri Nov 9 09:04:02 2012-0800
,得到了unix时间中完全相同的时间戳<代码>1352480642

  • 我的python 2.7.10版本
  • dateutil 1.5的我的版本
这是我运行测试的代码

#!/usr/bin/python
import time
from dateutil import parser

def get_timestamp(time_string):
    timing = parser.parse(time_string)
    return time.mktime(timing.timetuple())

test_time1 = "Fri Nov 9 09:04:02 2012 -0500"
test_time2 = "Fri Nov 9 09:04:02 2012 -0800"
print get_timestamp(test_time1)
print get_timestamp(test_time2)
输出

1352480642.0
1352480642.0
1352469842.0
1352480642.0
预期产出

1352480642.0
1352480642.0
1352469842.0
1352480642.0

这与解析器无关,您将仅从
mktime()
中看到相同的行为,因为
datetime.timetuple()
没有任何时区偏移信息,
mktime()
localtime
相反。您可以通过在调用
timetuple()
之前将其转换为
localtime
来纠正此问题:

请注意,()上有一个图表,告诉您如何在这些表示形式之间进行转换:

From                        To                           Use
---------------------------------------------------------------------------
seconds since the epoch   | struct_time in UTC        |  gmtime()
seconds since the epoch   | struct_time in local time |  localtime()
struct_time in UTC        | seconds since the epoch   |  calendar.timegm()
struct_time in local time | seconds since the epoch   |  mktime()
我个人的偏好是将解析的日期转换为UTC,在这种情况下,
calendar.timegm()
将是合适的函数:

from calendar import timegm
def print_timegm(dt):
    print(timegm(dt.timetuple()))

print_timegm(dt_est.astimezone(tz.tzutc())) # 1352469842.0
print_timegm(dt_pst.astimezone(tz.tzutc())) # 1352480642.0

在Python3中,两行代码都是
1352448242.0
!你确定时区被正确解析了吗?一点也不确定。我直接从GIT日志中提取这些字符串。我不是在解析python is。事实是:值因python版本而异!实际上,这个值根据时区的不同而不同,因为字符串中的时区被忽略了,我相信python只是占用了您的时区。正如我所看到的,由于时差的原因,你可能提前9个小时到达欧洲的某个地方。我喜欢先转换到当地时间的想法。但是我正在处理的数据有这样的日期字符串
Fri Nov 9 09:04:02 2012-0800
。无论如何,我可以这样做,而无需单独选择每个int来执行
datetime(2012,11,9,9,4,2)
@Whitecat我强烈建议使用UTC,而不是localtime,以避免与DST相关的问题。我不明白你为什么反对选择INT。我只是手动创建了dateutil解析器的输出,以向您展示它与解析器无关。您只需要更改解析器输出的时区,就像我在调用
timetuple
之前的示例中所做的那样。我反对手动选择int,因为我必须编写解析器,以识别字符串的不同部分。我还必须为每个时区创建不同的时间元组吗?因为时区是多个不同时区中的任意一个。@Whitecat我不建议您在这里使用日期文字
parse
返回时区感知的
datetime
对象。您可以使用
astimezone(tz.tzutc)
将其转换为UTC中的
datetime
对象,然后将其转换为
timetuple
,然后将其馈送到
calendar.timegm
。在我的示例中,我没有使用
dateutil.parser.parse
的唯一原因是因为您的问题与解析日期无关。