Длительность разбора с високосной секундой, например, 00:00:60 - PullRequest
0 голосов
/ 25 сентября 2018

Как я могу проанализировать длительность с скачком секунды до секунд?

Например, мы получаем от другой службы следующую длительность 00:00:60, что означает 1 минуту, а Java 8 DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]") throws

java.time.format.DateTimeParseException: Text '00:00:60' could not be parsed: Invalid value for SecondOfMinute (valid values 0 - 59): 60

Это имеет смысл, поскольку в стандарте ISO, используемом Java, нет понятия 60 секунд.

Я бы хотел избежать использования String::replace (в качествепредлагается в других SO-ответах на аналогичный случай) и использование внешней библиотеки, если это возможно.

Это текущий код, который вызывает исключение:

private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]");

public static Integer parseToSeconds(String durationText) {

    return LocalTime.parse(durationText, TIME_FORMATTER).toSecondOfDay();
}

Ответы [ 2 ]

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

Это то, для чего у нас есть мягкий способ разрешения.

    String durationText = "00:00:60";
    DateTimeFormatter lenientTimeFormatter = DateTimeFormatter.ISO_LOCAL_TIME
            .withResolverStyle(ResolverStyle.LENIENT);
    int seconds = LocalTime.parse(durationText, lenientTimeFormatter).toSecondOfDay();
    System.out.println(seconds);

Вывод этого фрагмента:

60

Если ваш60 секунд - это действительно длительность, а не время суток, мне это не очень нравится.Тогда я бы предпочел разобраться в Duration, как вы делаете в своем собственном ответе.Я знаю, что String.replace с трудно читаемым регулярным выражением тоже не очень хорошее решение, но я все же думаю, что предпочел бы его, притворяясь, что продолжительность - это время дня, если это совершенно неправильно.Я просто подумал, что в любом случае предоставлю эту возможность и позволю вам сделать свой выбор, исходя из вашей реальности и предпочтений.

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

Вот как я решил проблему:

private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss[.SSS]");

public static long parsesToSeconds(String durationText) {
    Duration timeSum = Duration.ZERO;
    // Reformat to ISO 8601
    durationText = durationText.replaceFirst("(\\d{2}):(\\d{2}):(\\d{2}(?:\\.\\d+)?)", "PT$1H$2M$3S");

    timeSum = timeSum.plus(Duration.parse(durationText));

    return timeSum.getSeconds();
}

Кредиты Оле В.В. с его ответом здесь: https://stackoverflow.com/a/52315938/2240409

...