2

我正在尝试仅使用标准库将 ISO8601 时间格式转换为 python 中的秒/unix/epoch 时间。

时间格式 = '2012-09-30T15:31:50.262-08:00'

基本上时间将是一个字符串,它会解析并将其转换回秒。

切片和挑选我们想要的值是可能的,但还有比这更好的方法吗?

import datetime, time
def convert_enddate_to_seconds(self, ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
     dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')+\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = time.mktime(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds
4

2 回答 2

2

Celada回答后的最终正确答案。下面我验证了 xml.iso8601.parse 的输出也返回与函数生成的结果相同的结果。感谢 Celada 提供原始代码的问题。

>>> import calendar, datetime, time 
>>> def convert_enddate_to_seconds(ts):
...   """Takes ISO 8601 format(string) and converts into epoch time."""
...   dt = datetime.datetime.strptime(ts[:-7],'%Y-%m-%dT%H:%M:%S.%f')-\
...       datetime.timedelta(hours=int(ts[-5:-3]),
...       minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
...   seconds = calendar.timegm(dt.timetuple()) + dt.microsecond/1000000.0
...   return seconds
... 
>>> import iso8601
>>> ts = '2012-09-30T15:31:50.262-08:00'
>>> iso8601.parse(ts)
1349047910.0
>>> convert_enddate_to_seconds(ts)
1349047910.26
>>> 
于 2012-09-04T17:14:23.010 回答
1

对于初学者,您的示例代码中至少有 4 个错误:

  • 您的strptime格式需要小数点和秒后的数字,但您的示例输入没有。
  • ts[:-7]位没有正确地切掉字符串的结尾。ts[:-6]看起来更正确:您想从字符串的末尾切出 6 个字符(2 个代表 tz 小时,2 个代表 tz 分钟,1 个代表 :,1 个代表 + 或 -)。
  • 您正在添加应该减去它的时区偏移量。您必须从东半球时区给定的时间中减去小时和分钟才能返回 UTC,而不是添加它们。
  • 您正在使用time.mktime()which 假定时间元组是在本地时间给出的,但它实际上是 UTC。你需要calendar.timegm()改用。

这是您的代码更新为但后三个问题。第一个问题仍然存在,因为我不知道您是否打算在输入字符串中强制出现小数秒。您可以进一步调整它。

import datetime, time, calendar

def convert_enddate_to_seconds(ts):
    """Takes ISO 8601 format(string) and converts into epoch time."""
    dt = datetime.datetime.strptime(ts[:-6],'%Y-%m-%dT%H:%M:%S.%f')-\
                datetime.timedelta(hours=int(ts[-5:-3]),
                minutes=int(ts[-2:]))*int(ts[-6:-5]+'1')
    seconds = calendar.timegm(dt.timetuple()) + dt.microsecond/1000000.0
    return seconds

使用2010-01-04T12:15:30.1+01:00作为测试输入,我得到 1262603730.1 作为输出,这是正确的。

至于您的问题:不,如果您只将自己限制在标准库中,那么您不太可能比这更简洁。

于 2012-09-01T02:55:21.270 回答