2017-09-01 23 views
1

我正在使用dateutil.parser。我只想解析日期,時間和時區信息的日期字符串。是否有可能讓dateutil.parser.parse只解析iso8601字符串並拋出其他格式的錯誤

例如我只想接受有效日期爲「2014-11-11T18:28:50.588Z」。如果用戶已通過「2013-12-11」(這又是dateutil的有效日期),那麼我想拋出錯誤。

P.S - 我知道我可以使用正則表達式,但我希望,看看我是否可以使用dateutil庫

回答

0

不,這是不可能的dateutil.parserdateutil的解析器主要用於處理任何東西,看起來像一個日期,並且當前具有最小的定製選項。

有一點要注意的是,無論是2013-12-112014-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 
相關問題