datetime.strptime()的Python时区'%z'指令不可用

时间:2014-10-02 16:52:51

标签: python datetime tzinfo

使用'%z' datetime.strptime()的模式

我有一个表示日期的字符串文本,我完全能够解析它并将其转换为干净的日期时间对象:

date = "[24/Aug/2014:17:57:26"
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S")  

除非我无法使用指定的{em>%z模式 时区来捕捉整个日期字符串<{3}}

date_tz = 24/Aug/2014:17:57:26 +0200
dt = datetime.strptime(date, "[%d/%b/%Y:%H:%M:%S %z]")
>>> ValueError: 'z' is a bad directive in format '[%d/%b/%Y:%H:%M:%S %z]'

因为here

  

strftime()实现每个平台

我确切地知道天真的tzinfo指令没有这样的问题&#39;%Z&#39;

解决方法:将tzinfo字符串转换为tzinfo对象

通过使用this bug report模块将GST时间格式字符串转换为tzinfo对象[如此处建议] [4],我可以完美地做出以下解决方法 然后插入dateutil

问题:让%z可用于我的平台?

但是因为我显然需要%z模式用于进一步的项目,我想找到一个解决方案来避免这种解决方法并使用外部模块来完成这个简单的任务。 你能给我一些阅读吗?我认为较新版本的python(我在2.7上)可以处理它,但我现在不想改变我的版本,因为这个小而重要的细节。

[编辑]

好吧,看到评论让我重新思考如何使用strptime()解析电子邮件时区指示器而不知道区域设置时间?

3 个答案:

答案 0 :(得分:20)

strptime() is implemented in pure Python。与strftime()不同;它[支持哪些指令]并不依赖于平台。自Python 3.2起支持%z

>>> from datetime import datetime
>>> datetime.strptime('24/Aug/2014:17:57:26 +0200', '%d/%b/%Y:%H:%M:%S %z')
datetime.datetime(2014, 8, 24, 17, 57, 26, tzinfo=datetime.timezone(datetime.timedelta(0, 7200)))
  

如何使用strptime()解析电子邮件时区指示器而不了解区域设置时间?

Python 2.7中没有具体的时区实现。您可以轻松实现UTC偏移量解析,请参阅How to parse dates with -0400 timezone string in python?

答案 1 :(得分:14)

继续@ j-f-sebastians的回答,这是对python 2.7的修复

而不是使用:

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[17]=='+':
       ret-=timedelta(hours=int(t[18:20]),minutes=int(t[20:]))
    elif t[17]=='-':
       ret+=timedelta(hours=int(t[18:20]),minutes=int(t[20:]))
    return ret

print(dt_parse('2017-01-12T14:12 -0530'))

答案 2 :(得分:0)

Uri的答案很棒,拯救了我的生命,但是当你拥有的时候  USE_TZ = True你需要小心时间,以避免警告&#34; RuntimeWarning:DateTimeField&#34;如果你把utc添加到回报中会更好。

import pytz
from datetime import datetime, timedelta
def dt_parse(t):
    ret = datetime.strptime(t[0:19],'%Y-%m-%dT%H:%M:%S')
    if t[23]=='+':
        ret-=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
    elif t[23]=='-':
        ret+=timedelta(hours=int(t[24:26]), minutes=int(t[27:]))
    return ret.replace(tzinfo=pytz.UTC)