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

2024-04-23 17:48:02 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

除了我不能使用指定的%z模式用时区捕捉整个日期字符串之外here

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

因为正如this bug report所说

strftime() is implemented per platform

我确定naive tzinfo指令'%Z'没有这样的问题

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

我可以通过使用dateutil模块将GST时间格式字符串转换为tzinfo对象[如这里所建议的][4]来完美地解决以下问题 然后插入tzinfo into datetime object

问题:是否为我的模板提供%z?

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

[编辑]

好吧,看到评论让我重新制定了一个问题:如何使用strtime()解析电子邮件时区指示器,而不必知道区域设置时间?


Tags: 模块对象方法字符串版本datetimedateis
3条回答

^{} is implemented in pure 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)))

how to parse Email time zone indicator using strptime() without being aware of locale time?

Python2.7中没有具体的时区实现。您可以很容易地实现UTC偏移解析,请参见How to parse dates with -0400 timezone string in python?

乌里的回答很好,救了我的命,但是当你 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)

在continue to@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'))

相关问题 更多 >