を使用することができるかどうかを確認するために期待していました。 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