首页 > 解决方案 > 在 Python 3.6 中转换日期时间的偏移量

问题描述

在发布此之前我已经进行了足够的研究,我知道有很多类似的问题,但没有一个有可靠或统一的解决方案,而且我的情况也略有不同。

我的情况很简单。我将以下值2019-07-31 12:02:35+00:00存储在变量中。我想把时间部分单独分开。这可以使用“strptime”来完成,我尝试了以下方法onlytime = datetime.datetime.strptime(str(dateandtime), "%Y-%m-%d %H:%M:%S%z")但显示以下错误

“ValueError:时间数据'2019-07-31 12:02:35+00:00'与格式'%Y-%m-%d %H:%M:%S%%z'不匹配”

%z应该使用 pyhton 3.2 及更高版本,所以这不应该是问题。我也尝试过 date-utils() 但文档令人困惑,我找不到在这里正确使用它们的方法。那么在这里可以做些什么来实现我的用例呢?以下是我的完整代码:

#!/usr/bin/env python3
import boto3
from datetime import date, datetime, timedelta
import datetime
inputdata = boto3.client('s3')
details = inputdata.list_objects_v2(Bucket='testbucket')
for timedetails in details['Contents']:
    dateandtime = timedetails['LastModified']
    onlytime = datetime.datetime.strptime(str(dateandtime), "%Y-%m-%d %H:%M:%S%z")
    print (onlytime)

更新:当我单独执行日期时间部分时,相同的程序正在在线编译器中工作。因此,我添加了有关输入 JSON 的更多详细信息:这是存储在变量中的 JSONdetails

{
'Contents': [{
        u 'LastModified': datetime.datetime(2019, 7, 31, 12, 2, 35, tzinfo = tzlocal()),
        u 'ETag': '"1a8f23054d922eff88a644bd003e6397"',
        u 'StorageClass': 'STANDARD',
        u 'Key': u 'EVNET- task & window.docx',
        u 'Size': 783570
    }
}

但是,当我打印存储在其中的值时,dateandtime它显示为2019-07-31 12:02:35+00:00. 我不确定这些细节是否意味着什么,但是。

标签: pythondatetimeboto3

解决方案


在 3.7 版更改: 当 %z 指令提供给 strptime() 方法时,UTC 偏移量可以有一个冒号作为小时、分钟和秒之间的分隔符。例如,“+01:00:00”将被解析为一小时的偏移量。此外,提供“Z”与“+00:00”相同。

好像python 3.6只支持+0000,没有冒号

https://docs.python.org/3.7/library/datetime.html#strftime-and-strptime-behavior

这个怎么样:

import datetime
import re
regex = r"([+-])([0-9]{2}):([0-9]{2})"
subst = "\\1\\2\\3"
dateandtime = "2019-07-31 12:02:35+00:00"
dateandtime = re.sub(regex, subst, dateandtime, 0)
print(dateandtime)
onlytime = datetime.datetime.strptime(str(dateandtime),"%Y-%m-%d %H:%M:%S%z")
print(onlytime)

推荐阅读