Какой самый простой способ десериализации времени, читаемого человеком, в Java? - PullRequest
0 голосов
/ 08 сентября 2018

Мне нужен настраиваемый тайм-аут для проекта, который читает различные конфиги из файла YAML.

Я заметил, что java.time.Duration имеет метод parse , который используется Джексоном для десериализации строк длительности. Проблема в том, что он использует форматирование ISO-8601 и ожидает, что продолжительность будет иметь формат PnDTnHnMn.nS. Хотя следует придерживаться стандартов, рекомендуется просить людей указать время ожидания, поскольку PT10M не лучший вариант, а 10m предпочтительнее.

Я написал собственный десериализатор для полей длительности, но кажется странным, что Джексон не может справиться с этим по умолчанию.

Какой самый простой способ десериализации дружественных человеку 10m, 5s и 1h до java.time.Duration с использованием Jackson ObjectMapper?

1 Ответ

0 голосов
/ 08 сентября 2018

«Самый простой» способ десериализации дружественного человеку 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);
}

Test

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
...