1. 程式人生 > 其它 >RFC 822時間格式化(python)

RFC 822時間格式化(python)

技術標籤:資料庫python大資料RFC 822時間戳

最近工作上需要解析響應頭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格式的時間儲存資料庫了