如何用Python中的-0400时区字符串解析日期?我有一个表格‘2009/05/13 19:19:30-0400’的日期串。看起来早期版本的Python可能支持字符串中的%z格式标记,用于尾随时区规范,但2.6.x似乎已经删除了这一点。将此字符串解析为datetime对象的正确方法是什么?
3 回答

Helenr
TA贡献1780条经验 获得超4个赞
%z
>>> from datetime import datetime>>> datetime.strptime('2009/05/13 19:19:30 -0400', '%Y/%m/%d %H:%M:%S %z') datetime.datetime(2009, 5, 13, 19, 19, 30, tzinfo=datetime.timezone(datetime.timedelta(-1, 72000)))
from datetime import datetime date_str = '2009/05/13 19:19:30 -0400'naive_date_str, _, offset_str = date_str.rpartition(' ') naive_dt = datetime.strptime(naive_date_str, '%Y/%m/%d %H:%M:%S')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(repr(dt))# -> datetime.datetime(2009, 5, 13, 19, 19, 30, tzinfo=FixedOffset(-240))print(dt)# -> 2009-05-13 19:19:30-04:00
FixedOffset
from datetime import timedelta, tzinfoclass FixedOffset(tzinfo): """Fixed offset in minutes: `time = utc_time + utc_offset`.""" def __init__(self, offset): self.__offset = timedelta(minutes=offset) hours, minutes = divmod(offset, 60) #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 self.__name = '<%+03d%02d>%+d' % (hours, minutes, -hours) 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)

萧十郎
TA贡献1815条经验 获得超13个赞
"%z"
datetime.strptime(t,'%Y-%m-%dT%H:%M %z')
timedelta
from datetime import datetime,timedeltadef dt_parse(t): ret = datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M') if t[18]=='+': ret-=timedelta(hours=int(t[19:22]),minutes=int(t[23:])) elif t[18]=='-': ret+=timedelta(hours=int(t[19:22]),minutes=int(t[23:])) return ret
GMT
添加回答
举报
0/150
提交
取消