Как разобрать разные форматы времени - PullRequest
0 голосов
/ 03 марта 2019

У меня есть разные форматы времени в строке (от счетчика видеоплеера).Например:

03:45 -> 3 munutes, 45 seconds
1:03:45 -> 1 hour, 3 munutes, 45 seconds
123:03:45 -> 123 hours, 3 munutes, 45 seconds

Как я могу проанализировать все эти форматы с помощью LocalTime lib?

Если я использую такой код:

LocalTime.parse(time, DateTimeFormatter.ofPattern("[H[H]:]mm:ss"));

Это прекрасно работает для "1: 03: 45 "или" 11:03:45 ", но для" 03:55 "у меня есть исключение

java.time.format.DateTimeParseException: Text '03:55' could not be parsed at index 5

Ответы [ 2 ]

0 голосов
/ 03 марта 2019

Есть больше возможностей.Я бы, вероятно, пошел для изменения временной строки, чтобы соответствовать синтаксису, принятому Duration.parse.

    String[] timeStrings = { "03:45", "1:03:45", "123:03:45" };
    for (String timeString : timeStrings) {
        String modifiedString = timeString.replaceFirst("^(\\d+):(\\d{2}):(\\d{2})$", "PT$1H$2M$3S")
                .replaceFirst("^(\\d+):(\\d{2})$", "PT$1M$2S");
        System.out.println("Duration: " + Duration.parse(modifiedString));
    }

Вывод:

Duration: PT3M45S
Duration: PT1H3M45S
Duration: PT123H3M45S

Случайчасы, минуты и секунды (два двоеточия) обрабатываются первым вызовом replaceFirst, который, в свою очередь, удаляет оба двоеточия и гарантирует, что второй replaceFirst ничего не заменит.В случае только одного двоеточия (минуты и секунды) первый replaceFirst не может ничего заменить и передает строку без изменений во второй вызов replaceFirst, который, в свою очередь, преобразуется в формат ISO 8601, принятый Duration.parse.

Вам нужен класс Duration по двум причинам: (1) Если я правильно понимаю, ваша временная строка обозначает длительность, поэтому использование LocalTime неверно и приведет в замешательство тех, кто поддерживает ваш код после вас.(2) Максимальное значение LocalTime равно 23: 59: 59.999999999, поэтому оно никогда не примет 123: 03: 45.

0 голосов
/ 03 марта 2019

Из комментариев и того, что я читал ранее, вы не можете разобрать mm:ss, чтобы решить вашу проблему, давайте преобразовать все времена в секунды, а затем преобразовать эти секунды в Длительность , а не в LocalTime , вот решение вашей проблемы:

String[] times = {"03:45", "1:03:45", "123:03:45"};
for (String time : times) {
    List<Integer> parts = Arrays.stream(time.split(":"))
            .map(Integer::valueOf)
            .collect(Collectors.toList());
    Collections.reverse(parts);

    int seconds = (int) IntStream.range(0, parts.size())
            .mapToDouble(index -> parts.get(index) * Math.pow(60, index))
            .sum();

    Duration result = Duration.ofSeconds(seconds);
    System.out.println(result);    
}

Выходы или длительность

PT3M45S              -> 03:45 
PT1H3M45S            -> 1:03:45  
PT123H3M45S          -> 123:03:45
...