如何在Python中解析带有-0400时区字符串的日期?
我有一个日期字符串,格式是 '2009/05/13 19:19:30 -0400'。看起来之前的Python版本可能支持在strptime中使用一个叫做 %z 的格式标签来处理后面的时区信息,但在2.6.x版本中似乎把这个功能去掉了。
那么,怎么才能把这个字符串正确地转换成一个日期时间对象呢?
6 个回答
26
这里是解决Python 2.7及更早版本中"%z"
问题的方法。
不要使用:
datetime.strptime(t,'%Y-%m-%dT%H:%M %z')
可以用timedelta
来处理时区,像这样:
from datetime import datetime,timedelta
def 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
(格林威治标准时间),这样在进行日期计算时就不用担心时区的问题了。
61
%z
在 Python 3.2 及以上版本中是支持的:
>>> 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, tzinfo
class 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)
133
你可以使用dateutil里的parse函数:
>>> from dateutil.parser import parse
>>> d = parse('2009/05/13 19:19:30 -0400')
>>> d
datetime.datetime(2009, 5, 13, 19, 19, 30, tzinfo=tzoffset(None, -14400))
这样你就能得到一个可以使用的日期时间对象。
正如所提到的,dateutil2.0是为Python 3.0写的,不能在Python 2.x上使用。如果你在用Python 2.x,就需要用dateutil1.5。