欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

RFC822时间格式化(python)

程序员文章站 2022-04-02 10:41:15
最近工作上需要解析响应头response headers中的Date字段我仔细一看,这种时间格式与往常所见到的,并不太一样,但是我手头的大部分响应头的时间格式均是如此,我猜想这些是不是遵循什么标准,就查到了这些共同遵循RFC 822标准,被称为RFC 822格式时间,可参照链接所说https://www.cnblogs.com/saolv/p/7828529.html,但是因为需要存入数据库的时间类型是datetime,所以需要做一个时间类型的转换,找遍网络,找到目前自己亲测使用的两种方法,总结分享...

最近工作上需要解析响应头response headers中的Date字段

RFC822时间格式化(python)

我仔细一看,这种时间格式与往常所见到的,并不太一样,但是我手头的大部分响应头的时间格式均是如此,我猜想这些是不是遵循什么标准,就查到了这些共同遵循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

正常情况下使用第一种方法也能解决多数问题了,但是在我处理数据的过程中,遇到了并不完全遵照标准的数据格式出现,程序就报错了,例如下面这个

RFC822时间格式化(python)

于是百般寻找,才发现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