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格式的时间保存数据库了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值