gpt4 book ai didi

java - 在 Java 中反序列化人类可读持续时间的最简单方法是什么?

转载 作者:行者123 更新时间:2023-11-30 02:02:55 24 4
gpt4 key购买 nike

我需要为项目设置可配置的超时,该项目从 YAML 文件读取不同的配置。

我注意到 java.time.Duration 有方法 parse Jackson 使用它来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有 PnDTnHnMn.nS 格式。虽然遵循标准是个好主意,但要求人们提供超时,因为 PT10M 并不是最佳选择,而 10m 是首选。

我确实为持续时间字段编写了一个自定义反序列化器,但奇怪的是 jackson 默认情况下无法处理这个问题。

将人类友好的 10m5s1h 反序列化为 java.time.Duration 的最简单方法是什么> 使用 Jackson ObjectMapper?

最佳答案

反序列化人类友好的 10m5s1h 的“最简单”方法可能是正则表达式和 Java 代码的组合。

public static Duration parseHuman(String text) {
Matcher m = Pattern.compile("\\s*(?:(\\d+)\\s*(?:hours?|hrs?|h))?" +
"\\s*(?:(\\d+)\\s*(?:minutes?|mins?|m))?" +
"\\s*(?:(\\d+)\\s*(?:seconds?|secs?|s))?" +
"\\s*", Pattern.CASE_INSENSITIVE)
.matcher(text);
if (! m.matches())
throw new IllegalArgumentException("Not valid duration: " + text);
int hours = (m.start(1) == -1 ? 0 : Integer.parseInt(m.group(1)));
int mins = (m.start(2) == -1 ? 0 : Integer.parseInt(m.group(2)));
int secs = (m.start(3) == -1 ? 0 : Integer.parseInt(m.group(3)));
return Duration.ofSeconds((hours * 60L + mins) * 60L + secs);
}

测试

System.out.println(parseHuman("1h"));
System.out.println(parseHuman("1 hour 200 minutes"));
System.out.println(parseHuman("3600 secs"));
System.out.println(parseHuman("2h3m4s"));

输出

PT1H
PT4H20M
PT1H
PT2H3M4S

关于java - 在 Java 中反序列化人类可读持续时间的最简单方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52230177/

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