在python3.6中转换datetime的偏移量

2024-09-29 00:17:10 发布

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

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

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

"ValueError: time data '2019-07-31 12:02:35+00:00' does not match format '%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)

更新:当我单独执行datetime部分时,同一个程序在联机编译器中工作。因此,我添加了关于输入JSON的更多细节:这是存储在变量details中的JSON

{
'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。我不确定这些细节是否意味着什么,但是。你知道吗


Tags: 方法importjsondatetimedatecontentsdetailsboto3
2条回答

问题是UTC偏移量。RFC3339 Internet日期/时间格式要求每个日期时间都包含一个UTC偏移量,并且这些偏移量可以是Z(Zulu时间的缩写)或+HH:MM或-HH:MM格式,如+05:00或-10:30。你知道吗

因此,这些都是有效的RFC 3339日期时间:

2008-09-03T20:56:35.450686Z
2008-09-03T20:56:35.450686+05:00
2008-09-03T20:56:35.450686-10:30

唉,strtime和strftime使用的格式字符串没有与rfc3339格式的UTC偏移量对应的指令。您需要使用第三方库或不带偏移量的解析。你知道吗

Helpful link

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

python3.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)

相关问题 更多 >