Fork me on GitHub

Python 把含有 TZ(UTC时间)的字符串 str 转换为 datetime 日期类型

今天在用 Python 处理 AWS S3存储的时候遇到个时间格式的问题,特别在此记录下:
我是想获取 bucket 下的 object 最后修改时间、然后对所有的超过 30 天的进行删除操作,但是提取到的是2018-03-05T09:20:005Z这种字符串。
它的类型为str,

1
2
3
4
>>> last_modfied
'2018-03-05T09:20:005Z'
>>> type(last_modfied)
<class 'str'>

首先得对其进行格式转换,转换为datetime类型才好进行日期的比较。这里使用 Python 内置datetime模块来完成:
datetime官方文档 datetime.strptime()方法根据代表日期和时间的字符串以相应的格式字符串创建日期时间对象。

使用方法:

datetime.strptime(date_string, format),以下是C标准(1989版本)要求的所有格式代码的列表,并且这些代码可以在所有平台上使用标准的C实现:

标识 含义 例子
%a 星期几的缩写名称 Sun, Mon, …, Sa
%A 星期几的全名 Sunday, Monday, …, Saturday
%w 星期几为十进制数字,其中0表示星期日,6表示星期六 0, 1, …, 6
%d 一个月中的一天作为零填充的十进制数字 01, 02, …, 31
%b 几月的缩写名称 Jan, Feb, …, Dec
%B 几月的全称 January, February, …, December
%m 几月作为零填充的十进制数字 01, 02, …, 12
%y 没有世纪的以零填充的十进制数字年份 00, 01, …, 99
%Y 有世纪的十进制数字年份 1001, 1002, …, 2013, 2014, …, 9998, 9999
%H 24小时制 00, 01, …, 23
%I 12小时制 01, 02, …, 12
%p 时间设置AM或PM AM, PM
%M 以零填充的十进制数字分钟 00, 01, …, 59
%S 以零填充的十进制数字秒 00, 01, …, 59
%f 以零填充的十进制数字微秒 000000, 000001, …, 999999
%z UTC偏移量格式为+ HHMM或-HHMM (empty), +0000, -0400, +1030
%Z 时区名称 (empty), UTC, EST, CST
%j 一年中的一天以零填充十进制数字 001, 002, …, 366
%U 一年的周数以周日开始,第一个星期日前一年的所有日子都被认为是在第0周 00, 01, …, 53
%W 一年的周数以周一开始,第一个星期日前一年的所有日子都被认为是在第0周 00, 01, …, 53
%c 以本地时区设置的日期和时间表示 ue Aug 16 21:30:00 1988 (en_US);
%x 以本地时区设置的日期 08/16/1988 (en_US),1988年8月16日(zh-cn)
%X 以本地时区设置的时间 21:30:00
%% ‘%’字符。 %

转换代码:

1
2
3
4
5
6
7
8
9
10
11
12
from datetime import datetime
date_str = "2018-03-05T09:20:005Z"
>>> date_str
'2018-03-05T09:20:005Z'
>>> type(date_str)
<class 'str'>
>>> date = datetime.strptime(date_str, '%Y-%m-%dT%H:%M:%S%fZ')
>>> type(date)
<class 'datetime.datetime'>
>>> date
datetime.datetime(2018, 3, 5, 9, 20, 0, 500000)

转成功换后即可对object日期与现在日期进行比较了。下例为 python 通过 boto s3 删除指定 30 天之前的 object 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from boto.s3.connection import S3Connection
from datetime import datetime, timedelta
today = datetime.now()
outgo_day = timedelta(days=30)
AWS_ACCESS_KEY_ID = Your AWS Access Key ID
AWS_SECRET_ACCESS_KEY = Your AWS Secret Access Key
conn = S3Connection('<aws access key>', '<aws secret key>')
bucket = conn.get_bucket('bucket-to-delete')
for key in bucket.list():
key.date = datetime.strptime(key.last_modfied, '%Y-%m-%dT%H:%M:%S%fZ')
if key.date < today - outgo_day:
key.delete()

以上!