python中的Dateutil解析错误返回了错误的值
我已经研究了很多可能的方法来解析python时间。但是使用parse.parse会错误地识别时区 我分析了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
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
的唯一原因是因为您的问题与解析日期无关。