Python 2.7 解决方案
从 cmets 中可以看出,OP 需要 Python 2.7 的解决方案。
显然,python 2.7 的 strptime 中没有 %z,尽管 the documentation claims the contrary,引发的错误是 ValueError: 'z' is a bad directive in format '%Y-%m-%dT%H:%M:%S.000%z'。
要解决这个问题,您需要先解析没有时区的日期,然后再添加时区。不幸的是,您需要为此子类化tzinfo。此答案基于this answer
from datetime import datetime, timedelta, tzinfo
class FixedOffset(tzinfo):
"""offset_str: Fixed offset in str: e.g. '-0400'"""
def __init__(self, offset_str):
sign, hours, minutes = offset_str[0], offset_str[1:3], offset_str[3:]
offset = (int(hours) * 60 + int(minutes)) * (-1 if sign == "-" else 1)
self.__offset = timedelta(minutes=offset)
# NOTE: the last part is to remind about deprecated POSIX GMT+h timezones
# that have the opposite sign in the name;
# the corresponding numeric value is not used e.g., no minutes
'<%+03d%02d>%+d' % (int(hours), int(minutes), int(hours)*-1)
def utcoffset(self, dt=None):
return self.__offset
def tzname(self, dt=None):
return self.__name
def dst(self, dt=None):
return timedelta(0)
def __repr__(self):
return 'FixedOffset(%d)' % (self.utcoffset().total_seconds() / 60)
date_with_tz = "2017-01-12T14:12:06.000-0500"
date_str, tz = date_with_tz[:-5], date_with_tz[-5:]
dt_utc = datetime.strptime(date_str, "%Y-%m-%dT%H:%M:%S.%f")
dt = dt_utc.replace(tzinfo=FixedOffset(tz))
print(dt)
最后一行打印:
2017-01-12 14:12:06-05:00