我正在使用dateutil.parser。我只想解析日期,時間和時區信息的日期字符串。是否有可能讓dateutil.parser.parse只解析iso8601字符串並拋出其他格式的錯誤
例如我只想接受有效日期爲「2014-11-11T18:28:50.588Z」。如果用戶已通過「2013-12-11」(這又是dateutil的有效日期),那麼我想拋出錯誤。
P.S - 我知道我可以使用正則表達式,但我希望,看看我是否可以使用dateutil庫
我正在使用dateutil.parser。我只想解析日期,時間和時區信息的日期字符串。是否有可能讓dateutil.parser.parse只解析iso8601字符串並拋出其他格式的錯誤
例如我只想接受有效日期爲「2014-11-11T18:28:50.588Z」。如果用戶已通過「2013-12-11」(這又是dateutil的有效日期),那麼我想拋出錯誤。
P.S - 我知道我可以使用正則表達式,但我希望,看看我是否可以使用dateutil庫
不,這是不可能的dateutil.parser
。 dateutil
的解析器主要用於處理任何東西,看起來像一個日期,並且當前具有最小的定製選項。
有一點要注意的是,無論是2013-12-11
和2014-11-11T18:28:50.588Z
是有效的ISO-8601日期,所以即使你有一個規則說「解析唯一通過ISO-8601日期」,它仍然會趕上這兩種。
我的建議一般是,如果你知道這個日期字符串的確切格式,你應該使用strptime
,例如:
from datetime import datetime
from dateutil import tz
def parse_datetime(dt_str):
return datetime.strptime(dt_str, '%Y-%m-%dT%H:%M:%S.%fZ').replace(tzinfo=tz.tzutc())
if __name__ == "__main__":
print(parse_datetime("2014-11-11T18:28:50.588Z"))
try:
parse_datetime("2013-12-11")
except ValueError:
print("Failed to parse!")
# Returns:
#
# 2014-11-11 18:28:50.588000+00:00
# Failed to parse!
如果你想成爲一個更靈活一點,允許日期不Z
擴展,或沒有浮點數,我發現最快的方法是做一個if
/elif
塊檢查字符串的長度。這裏是我將如何做到這一點:
from datetime import datetime
from dateutil import tz
def parse_datetime(dt_str):
tzinfo = None
if dt_str.endswith('Z'):
tzinfo = tz.tzutc()
dt_str = dt_str[:-1]
if len(dt_str) == 23:
fmt = '%Y-%m-%dT%H:%M:%S.%f'
elif len(dt_str) == 19:
fmt = '%Y-%m-%dT%H:%M:%S'
else:
raise ValueError("Unknown format for date: {}".format(dt_str))
return datetime.strptime(dt_str, fmt).replace(tzinfo=tzinfo)
if __name__ == "__main__":
print(parse_datetime("2014-11-11T18:28:50.588"))
print(parse_datetime("2014-11-11T18:28:50.588Z"))
print(parse_datetime("2014-11-11T18:28:50"))
print(parse_datetime("2014-11-11T18:28:50Z"))
try:
parse_datetime("2013-12-11")
except ValueError as e:
print(e)
# Returns:
#
# 2014-11-11 18:28:50.588000
# 2014-11-11 18:28:50.588000+00:00
# 2014-11-11 18:28:50
# 2014-11-11 18:28:50+00:00
# Unknown format for date: 2013-12-11