日期时间 (Datetime)
Datetime 验证器使用 python-dateutil 库进行解析并返回 Python datetime 对象。
示例 yaml_snippet
date: 2016-10-22
datetime1: 2016-10-22T14:23:12+00:00
datetime2: 2016-10-22T14:23:12Z
datetime3: 20161022T142312Z
from strictyaml import Map, Datetime, YAMLValidationError, load, as_document
from collections import OrderedDict
from dateutil.tz.tz import tzutc
from datetime import datetime
from ensure import Ensure
schema = Map({
"date": Datetime(),
"datetime1": Datetime(),
"datetime2": Datetime(),
"datetime3": Datetime(),
})
equivalent_data = OrderedDict([
("date", datetime(2016, 10, 22, 0, 0)),
("datetime1", datetime(2016, 10, 22, 14, 23, 12, tzinfo=tzutc())),
("datetime2", datetime(2016, 10, 22, 14, 23, 12, tzinfo=tzutc())),
("datetime3", datetime(2016, 10, 22, 14, 23, 12, tzinfo=tzutc())),
])
四个日期时间中的每一个都是有效的并且被解析
Ensure(load(yaml_snippet, schema)).equals(equivalent_data)
.text 仍然返回原始文本
Ensure(load(yaml_snippet, schema)["date"].text).equals("2016-10-22")
非日期时间会引发异常
date: 1
datetime1: â
datetime2: b
datetime3: c
load(yaml_snippet, schema)
strictyaml.exceptions.YAMLValidationError:
when expecting a datetime
found arbitrary text
in "<unicode string>", line 2, column 1:
datetime1: "\xE2"
^ (line: 2)
Datetime 对象直接序列化为 ISO-8601 格式的 YAML 字符串
print(as_document(equivalent_data, schema).as_yaml())
date: 2016-10-22T00:00:00
datetime1: 2016-10-22T14:23:12+00:00
datetime2: 2016-10-22T14:23:12+00:00
datetime3: 2016-10-22T14:23:12+00:00
有效的日期时间字符串序列化为 YAML
print(as_document({"a": "2016-10-22"}, Map({"a": Datetime()})).as_yaml())
a: 2016-10-22
序列化无效日期时间字符串会引发异常
as_document({"a": "x"}, Map({"a": Datetime()}))
strictyaml.exceptions.YAMLSerializationError:
expected a datetime, got 'x'
序列化非字符串和非日期时间对象会引发异常
as_document({"a": 55}, Map({"a": Datetime()}))
strictyaml.exceptions.YAMLSerializationError:
expected a datetime, got '55' of type 'int'