我需要一个可配置的超时项目,该项目将从YAML文件中读取不同的配置。
我注意到PnDTnHnMn.nS
具有方法parse,Jackson使用该方法对持续时间字符串反序列化。问题在于它使用ISO-8601格式,并且期望持续时间具有PT10M
格式。遵循标准是一个好主意,但要求人们提供超时,因为10m
不是最佳选择,而10m
是首选。
我确实为持续时间字段编写了一个自定义反序列化器,但是奇怪的是杰克逊默认情况下无法处理此问题。
使用Jackson ObjectMapper将人类友好的5s
,1h
和java.time.Duration
反序列化为var btn = document.getElementById('btn');
btn.onclick = function() {
location.assign('https://stackoverflow.com/questions/52229901/navigate-to-route-on-button-click');
}
的最简单方法是什么?
答案 0 :(得分:2)
反序列化人类友好的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