RFC822时间格式化(python)
最近工作上需要解析响应头response headers中的Date字段
我仔细一看,这种时间格式与往常所见到的,并不太一样,但是我手头的大部分响应头的时间格式均是如此,我猜想这些是不是遵循什么标准,就查到了这些共同遵循RFC 822标准,被称为RFC 822格式时间,可参照链接所说https://www.cnblogs.com/saolv/p/7828529.html,但是因为需要存入数据库的时间类型是datetime,所以需要做一个时间类型的转换,找遍网络,找到目前自己亲测使用的两种方法,总结分享。
1.datetime.strptime
python中的datetime.strptime模块提供了时间格式化的功能,代码如下
from datetime import datetime
dd = "Mon, 30 Nov 2020 01:07:30 GMT"
GMT_FORMAT = '%a, %d %b %Y %H:%M:%S %Z'
print(datetime.strptime(dd, GMT_FORMAT))
需要注意的是,这种格式化方式具有较大的局限性,需要GMT_FORMAT与上面dd的时间格式一一对应,如果无法对应,就会报错,可以根据自己需要匹配的时间格式自行调整,%a、%d等含义,可以查看以下链接,自行调整https://www.runoob.com/python/att-time-strftime.html
2.email.utils
正常情况下使用第一种方法也能解决多数问题了,但是在我处理数据的过程中,遇到了并不完全遵照标准的数据格式出现,程序就报错了,例如下面这个
于是百般寻找,才发现python标准库中email模块对非标准化的RFC 822时间提供了解析方法,感兴趣的同学可以参阅python官方文档https://docs.python.org/zh-cn/3/library/email.utils.html#email.utils.parsedate,这里直接贴代码
from email import utils
dd = 'Mon Nov 30 14:00:51 2020'
print(utils.parsedate_to_datetime(dd))
于是我很开心的把我所有的时间解析代码,都换成了这个,结果,又报错了~~~
经过我测试发现,当原本的RFC 822格式时间字符串没有后面UTC或者GMT时区的时候,调用parsedate_to_datetime方法,返回的是一个简单型datetime,而如果附带了时区,转换得到的datetime将会是一个感知型datetime,感知型datetime可以标识出时间与标准UTC时间的差值,但是在数据库字段datetime类型中,无法保存感知型datetime,所以需要得到简单型datetime,经过查看parsedate_to_datetime方法代码发现,可以使用datetime.datetime()方法对utils.parse方法返回的元组进行格式化,于是新的代码如下
from email import utils
from datetime import datetime
dd = 'Mon, 30 Nov 2020 01:07:30 GMT'
dis_time = utils.parsedate(dd)
print(datetime(*dis_time[:6]))
至此就可以完美将RFC 822格式的时间保存数据库了
本文地址:https://blog.csdn.net/xiyouxiaotang/article/details/112600084