使用strptime将偏移量的时间戳转换为datetime obj

我想使用strptime方法将格式“2012-07-24T23:14:29-07:00”的时间戳转换为python中的datetime对象。 问题在于时间偏移(-07:00)。 没有抵消我可以成功地做

time_str = "2012-07-24T23:14:29" time_obj=datetime.datetime.strptime(time_str,'%Y-%m-%dT%H:%M:%S') 

但与我试图抵消

 time_str = "2012-07-24T23:14:29-07:00" time_obj=datetime.datetime.strptime(time_str,'%Y-%m-%dT%H:%M:%S-%z'). 

但是它给出了一个Value错误,说“z”是一个糟糕的指令。

任何想法的工作?

Python 2 strptime()函数确实不支持时区的%z格式(因为底层time.strptime()函数不支持它)。 你有两个select:

  • strptimeparsing时忽略时区:

     time_obj = datetime.datetime.strptime(time_str[:19], '%Y-%m-%dT%H:%M:%S') 
  • 使用dateutil模块 ,它的parsing函数处理时区:

     from dateutil.parser import parse time_obj = parse(time_str) 

在命令提示符下快速演示:

 >>> from dateutil.parser import parse >>> parse("2012-07-24T23:14:29-07:00") datetime.datetime(2012, 7, 24, 23, 14, 29, tzinfo=tzoffset(None, -25200)) 

您也可以升级到Python 3.2或更高版本,其中时区支持已经改进到%z可以工作的地步,前提是您从input中删除最后一个: -%z之前:

 >>> import datetime >>> time_str = "2012-07-24T23:14:29-07:00" >>> datetime.datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S%z') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python3.4/_strptime.py", line 500, in _strptime_datetime tt, fraction = _strptime(data_string, format) File "/Users/mj/Development/Library/buildout.python/parts/opt/lib/python3.4/_strptime.py", line 337, in _strptime (data_string, format)) ValueError: time data '2012-07-24T23:14:29-07:00' does not match format '%Y-%m-%dT%H:%M:%S%z' >>> ''.join(time_str.rsplit(':', 1)) '2012-07-24T23:14:29-0700' >>> datetime.datetime.strptime(''.join(time_str.rsplit(':', 1)), '%Y-%m-%dT%H:%M:%S%z') datetime.datetime(2012, 7, 24, 23, 14, 29, tzinfo=datetime.timezone(datetime.timedelta(-1, 61200))) 

在Python 3.2+中:

 from datetime import datetime time_str = "2012-07-24T23:14:29-0700" dt_aware = datetime.strptime(time_str, '%Y-%m-%dT%H:%M:%S%z') print(dt_aware.isoformat('T')) # -> 2012-07-24T23:14:29-07:00 

注意:它不支持:-0700部分(两种格式都被rfc 3339允许)。 查看date时间:添加分析RFC 3339date和时间的function 。

在较旧的Python版本(如Python 2.7)上,您可以手动parsingutc偏移量:

 from datetime import datetime time_str = "2012-07-24T23:14:29-0700" # split the utc offset part naive_time_str, offset_str = time_str[:-5], time_str[-5:] # parse the naive date/time part naive_dt = datetime.strptime(naive_time_str, '%Y-%m-%dT%H:%M:%S') # parse the utc offset offset = int(offset_str[-4:-2])*60 + int(offset_str[-2:]) if offset_str[0] == "-": offset = -offset dt = naive_dt.replace(tzinfo=FixedOffset(offset)) print(dt.isoformat('T')) 

FixedOffset类是在这里定义的 。

ValueError: 'z' is a bad directive in format...

(注意:我必须坚持使用python 2.7)

我有一个类似的问题,从git log --date=iso8601的输出parsing提交date,实际上它不是ISO8601格式(因此在更高版本中增加了--date=iso8601-strict )。

由于我使用django我可以利用这里的工具。

https://github.com/django/django/blob/master/django/utils/dateparse.py

 >>> from django.utils.dateparse import parse_datetime >>> parse_datetime('2013-07-23T15:10:59.342107+01:00') datetime.datetime(2013, 7, 23, 15, 10, 59, 342107, tzinfo=+0100) 

你可以使用自己的正则expression式来代替strptime