为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
Helenr

TA贡献1780条经验 获得超4个赞

%z在Python3.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, 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)


查看完整回答
反对 回复 2019-07-03
?
萧十郎

TA贡献1815条经验 获得超13个赞

下面是修复"%z"为Python2.7及更高版本发行

而不是使用:

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,这样就可以在不担心时区的情况下进行日期运算。


查看完整回答
反对 回复 2019-07-03
  • 3 回答
  • 0 关注
  • 928 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信