20

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

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

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

除了我无法使用此处指定的%z 模式捕获具有时区的整个日期字符串

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]'

因为正如这个错误报告所说

strftime() 是按平台实现的

我确切地说,天真的 tzinfo 指令 '%Z' 没有这样的问题

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

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

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

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

[编辑]

好吧,看到评论让我重新提出了我的问题,如何在不知道语言环境时间的情况下使用 strptime() 解析电子邮件时区指示符?

4

3 回答 3

26

strptime()是在纯 Python 中实现的。不像strftime(); 它[支持哪些指令]不依赖于平台。%z从 Python 3.2 开始支持:

>>> 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 偏移解析,请参阅如何在 python 中使用 -0400 时区字符串解析日期?

于 2014-10-03T10:47:22.357 回答
15

在继续@jf-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'))
于 2016-08-17T09:19:51.587 回答
1

Uri 的答案很棒,救了我的命,但是当你有 USE_TZ = True你的时候你需要小心时间,如果你将 utc 添加到返回中,避免警告“RuntimeWarning:DateTimeField”会更好。

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)
于 2017-09-19T00:10:11.357 回答