在 Java 中反序列化人类可读持续时间的最简单方法是什么?
What is the easiest way to deserialize human readable time duration in Java?
我需要为一个项目配置超时,它从 YAML 文件读取不同的配置。
我注意到 java.time.Duration
有方法 parse 被 Jackson 用来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有 PnDTnHnMn.nS
格式。虽然遵循标准是个好主意,但要求人们提供超时,因为 PT10M
不是最佳选择,10m
是首选。
我确实为持续时间字段编写了自定义反序列化程序,但 Jackson 无法默认处理这个问题似乎很奇怪。
使用 Jackson ObjectMapper 将人类友好的 10m
、5s
和 1h
反序列化为 java.time.Duration
的最简单方法是什么?
"Easiest" 反序列化人类友好的方法 10m
、5s
和 1h
可能是正则表达式和 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
我需要为一个项目配置超时,它从 YAML 文件读取不同的配置。
我注意到 java.time.Duration
有方法 parse 被 Jackson 用来反序列化持续时间字符串。问题在于它使用 ISO-8601 格式并期望持续时间具有 PnDTnHnMn.nS
格式。虽然遵循标准是个好主意,但要求人们提供超时,因为 PT10M
不是最佳选择,10m
是首选。
我确实为持续时间字段编写了自定义反序列化程序,但 Jackson 无法默认处理这个问题似乎很奇怪。
使用 Jackson ObjectMapper 将人类友好的 10m
、5s
和 1h
反序列化为 java.time.Duration
的最简单方法是什么?
"Easiest" 反序列化人类友好的方法 10m
、5s
和 1h
可能是正则表达式和 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