gpt4 book ai didi

java - YAML、时间戳和 SnakeYAML 引擎

转载 作者:行者123 更新时间:2023-12-02 08:46:32 27 4
gpt4 key购买 nike

我不确定 YAML“时间戳”应该如何表示。来自 YAML 1.2 specification ,似乎 YAML 只是假设如果您有一个看起来像 ISO 8601 日期的字符串格式的值,那么它会被解析为日期,除非您另有说明。以下是规范中的几个示例:

date: 2002-12-14
not-date: !!str 2002-04-28

Timestamp Language-Independent Type for YAML™ Version 1.1工作草案(从 2005 年开始,目前是 15 年前!)似乎表明应该使用 tag:yaml.org,2002:timestamp 形式的特殊标签。它还表示 !!timestamp 的简写。

在 Java 中使用 SnakeYAML Engine v2.0 (org.snakeyaml:snakeyaml-engine:2.0) 我尝试解析 2002-12-14 表单,并得到一个字符串作为解析值,而不是任何日期对象的排序。我看到 SnakeYAML 引擎存储库有一个 example使用 !!timestamp 方法(例如 !!timestamp 2020-03-24T12:34:00.333),但这是最近的更改,我确定这是否支持尚未发布。

我尝试了 fooBar: !!timestamp 2020-03-24fooBar: !!timestamp 2020-03-24T12:34:00.333 两种形式,但是SnakeYAML 引擎报告:

could not determine a constructor for the tag tag:yaml.org,2002:timestamp

那么在 YAML 中表示日期(特别是 YYYY-MM-DD 的本地日期)的官方方法是什么?最新的 YAML 规范中是否反射(reflect)了正确的方法? SnakeYAML 引擎是否支持官方 YAML 日期方法?

最佳答案

From the YAML 1.2 specification, it would seem that YAML just assumes that if you have a value in string format that looks like an ISO 8601 date, then it is parsed as a date unless you say differently.

没有。 YAML 规范给出了应该支持的三种模式(Failsafe、JSON 和 Core);它们都不包含时间戳类型。然而,如果使用支持它的模式,那么看起来像时间戳的标量可以被解析。该规范仅告诉您,如果您想确保标量不作为时间戳加载,请在其前面添加 !!str

So what is the official way to represent a date (specifically a local date with YYYY-MM-DD) in YAML.

您链接的!!timestamp定义最接近官方方式。但是,包含它的标签存储库不是规范的一部分,并且不需要实现来支持它。此外,它是为过时的 YAML 1.1 定义的。

这意味着 SnakeYAML 根本不需要支持时间戳。您可以在给出的示例中看到不包括时间戳支持;该示例本身实现了加载时间戳。您可以修改该代码以与普通公共(public)接口(interface)一起使用:

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");

关于java - YAML、时间戳和 SnakeYAML 引擎,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61049072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com