从YAML 1.2规范来看,YAML似乎只是假设,如果您有一个字符串格式的值,看起来像ISO 8601日期,那么它将被解析为日期,除非您另有说明。
不会。YAML规范给出了三种模式(故障保护、JSON和核心),它们可以
应该
得到支持;它们都不包含时间戳类型。然而,看起来像时间戳的标量
可以
如果使用了支持它的模式,则可以进行这样的分析。规范只告诉您,如果要确保标量是
不
作为时间戳加载,在其前面加上
!!str
.
那么,在YAML中表示日期(特别是带有YYYY-MM-DD的本地日期)的官方方式是什么呢。
这个
!!timestamp
您链接的定义与
官方途径
会的。但是,包含它的标记存储库不是规范的一部分,不需要实现来支持它。此外,它是为过时的YAML 1.1定义的。
这意味着SnakeYAML根本不需要支持时间戳。您可以在给出的示例中看到,不包括时间戳支持;该示例实现了加载时间戳本身。您可以修改该代码以与普通公共界面一起使用:
class TimestampConstructor extends Constructor {
public static final Pattern TIMESTAMP = Pattern
.compile("^(?:[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]|[0-9][0-9][0-9][0-9]-[0-9][0-9]?-[0-9][0-9]?(?:[Tt]|[ \t]+)[0-9][0-9]?:[0-9][0-9]:[0-9][0-9](?:\\.[0-9]*)?(?:[ \t]*(?:Z|[-+][0-9][0-9]?(?::[0-9][0-9])?))?)$");
public static final Tag TAG = new Tag(Tag.PREFIX + "timestamp");
public TimestampConstructor() {
this.yamlConstructors.put(TAG, new ConstructTimestamp());
}
private class ConstructTimestamp extends AbstractConstruct {
public Object construct(Node node) {
String val = (String) constructScalar(node);
return LocalDateTime.parse(val);
}
}
}
然后,像这样使用:
Yaml yaml = new Yaml(new TimestampConstructor());
yaml.addImplicitResolver(TimestampConstructor.TAG,
TimestampConstructor.PATTERN, "0123456789");