python中datetime是比較常用的,平時用起來也沒什么問題,但是今天2020年2月29日服務器卻開始報錯了,這里有個平時難以注意的坑
服務器上跑的是新浪網的爬蟲,抓取的頁面信息中帶有日期 XX月XX日,需要strfptime轉化一下,型如
import datetime
datetime.datetime.strptime('(02月29日 10:47)', '(%m月%d日 %H:%M)')
這里會報:ValueError: day is out of range for month
debug一下可以發現,datetime在處理未提供年份的日期時候,是按照如下圖所示的邏輯處理的
注意斷點處,將默認年設置為了1900,至于原因官方也在注釋中聲明了: ensure that February 29th is smaller than March 1st,可惜的是1900是平年,進而導致1900-02-29轉化datetime錯誤。
這種問題,沒有通用的處理方法,主要是業務上限制這個時間的使用,如果業務數據都是今年的那么直接獲取當前年份傳進去即可,如果處理老數據再涉及到時間前后對比的話就麻煩了,用當前時間不行,不用當前時間又會有影響,只能針對性的對具體業務場景寫一些針對性的邏輯來處理。