如何用Python中的-0400时区字符串解析日期?

如何用Python中的-0400时区字符串解析日期?

我有一个表格‘2009/05/13 19:19:30-0400’的日期串。看起来早期版本的Python可能支持字符串中的%z格式标记,用于尾随时区规范,但2.6.x似乎已经删除了这一点。

将此字符串解析为datetime对象的正确方法是什么?


MMMHUHU
浏览 929回答 3
3回答

Helenr

%z在Python3.2+中支持:>>>&nbsp;from&nbsp;datetime&nbsp;import&nbsp;datetime>>>&nbsp;datetime.strptime('2009/05/13&nbsp;19:19:30&nbsp;-0400',&nbsp;'%Y/%m/%d&nbsp;%H:%M:%S&nbsp;%z') datetime.datetime(2009,&nbsp;5,&nbsp;13,&nbsp;19,&nbsp;19,&nbsp;30, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tzinfo=datetime.timezone(datetime.timedelta(-1,&nbsp;72000)))关于早期版本:from&nbsp;datetime&nbsp;import&nbsp;datetime date_str&nbsp;=&nbsp;'2009/05/13&nbsp;19:19:30&nbsp;-0400'naive_date_str,&nbsp;_,&nbsp;offset_str&nbsp;=&nbsp;date_str.rpartition('&nbsp;') naive_dt&nbsp;=&nbsp;datetime.strptime(naive_date_str,&nbsp;'%Y/%m/%d&nbsp;%H:%M:%S')offset&nbsp;=&nbsp;int(offset_str[-4:-2])*60&nbsp;+ &nbsp;int(offset_str[-2:])if&nbsp;offset_str[0]&nbsp;==&nbsp;"-": &nbsp;&nbsp;&nbsp;offset&nbsp;=&nbsp;-offset dt&nbsp;=&nbsp;naive_dt.replace(tzinfo=FixedOffset(offset))print(repr(dt))#&nbsp;->&nbsp;datetime.datetime(2009,&nbsp;5,&nbsp;13,&nbsp;19,&nbsp;19,&nbsp;30, &nbsp;tzinfo=FixedOffset(-240))print(dt)#&nbsp;->&nbsp;2009-05-13&nbsp;19:19:30-04:00哪里FixedOffset是基于文档中的代码示例:from&nbsp;datetime&nbsp;import&nbsp;timedelta,&nbsp;tzinfoclass&nbsp;FixedOffset(tzinfo): &nbsp;&nbsp;&nbsp;&nbsp;"""Fixed&nbsp;offset&nbsp;in&nbsp;minutes:&nbsp;`time&nbsp;=&nbsp;utc_time&nbsp;+&nbsp;utc_offset`.""" &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__init__(self,&nbsp;offset): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__offset&nbsp;=&nbsp;timedelta(minutes=offset) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hours,&nbsp;minutes&nbsp;=&nbsp;divmod(offset,&nbsp;60) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#NOTE:&nbsp;the&nbsp;last&nbsp;part&nbsp;is&nbsp;to&nbsp;remind&nbsp;about&nbsp;deprecated&nbsp;POSIX&nbsp;GMT+h&nbsp;timezones &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;that&nbsp;have&nbsp;the&nbsp;opposite&nbsp;sign&nbsp;in&nbsp;the&nbsp;name; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;&nbsp;the&nbsp;corresponding&nbsp;numeric&nbsp;value&nbsp;is&nbsp;not&nbsp;used&nbsp;e.g.,&nbsp;no&nbsp;minutes &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;self.__name&nbsp;=&nbsp;'<%+03d%02d>%+d'&nbsp;%&nbsp;(hours,&nbsp;minutes,&nbsp;-hours) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;utcoffset(self,&nbsp;dt=None): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.__offset&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;tzname(self,&nbsp;dt=None): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;self.__name&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;dst(self,&nbsp;dt=None): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;timedelta(0) &nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;__repr__(self): &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;'FixedOffset(%d)'&nbsp;%&nbsp;(self.utcoffset().total_seconds()&nbsp;/&nbsp;60)

萧十郎

下面是修复"%z"为Python2.7及更高版本发行而不是使用:datetime.strptime(t,'%Y-%m-%dT%H:%M&nbsp;%z')使用timedelta要说明时区,如下所示:from&nbsp;datetime&nbsp;import&nbsp;datetime,timedeltadef&nbsp;dt_parse(t): &nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;datetime.strptime(t[0:16],'%Y-%m-%dT%H:%M') &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;t[18]=='+': &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret-=timedelta(hours=int(t[19:22]),minutes=int(t[23:])) &nbsp;&nbsp;&nbsp;&nbsp;elif&nbsp;t[18]=='-': &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ret+=timedelta(hours=int(t[19:22]),minutes=int(t[23:])) &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret请注意,日期将转换为GMT,这样就可以在不担心时区的情况下进行日期运算。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python