2017-09-01 6 views
1

私はdateutil.parserを使用しています。私は、日付、時刻、およびタイムゾーン情報を持つ日付文字列を解析したいだけです。dateutil.parser.parseにiso8601文字列を解析し、他の形式のエラーだけをスローすることが可能です

有効な日付を「2014-11-11T18:28:50.588Z」として受け入れるだけです。ユーザーが「2013-12-11」(dateutilの有効な日付です)に合格した場合は、エラーをスローします。

P.Sは - 私は正規表現を使用することができます知っているが、私はありません、これはdateutil.parserでは不可能であるdateutilライブラリ

答えて

0

を使用することができるかどうかを確認するために期待していました。 dateutilのパーサーは、主にの処理に使用されます。のようなもので、現在は最小限のカスタマイズオプションがあります。

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 
関連する問題