преобразование времени строки в объект Java «Текст не может быть проанализирован с индексом 0»

#java #time

#java #время

Вопрос:

У меня следующий формат строки «0 часов: 5 минут: 21 секунда». Мне нужно преобразовать в формат: «чч: мм: сс», чтобы я мог вычислить сумму общего количества часов в списке.

Я использую следующее

         DateTimeFormatter parser = DateTimeFormatter.ofPattern("hh 'hours' : mm 'mins' : ss 'secs'", Locale.US);
        LocalDate odt = LocalDate.parse(k, parser);

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String printDate = formatter.format(odt);
        System.out.println(printDate);
  

Но это выдает ошибку: «Текст’0 часов: 5 минут: 321 сек’ не удалось проанализировать с индексом 0».

Эта ошибка возникает в строке: LocalDate odt = LocalDate.parse(k, синтаксический анализатор);

Комментарии:

1. Почему это 312 секунд (когда это больше 60)?

2. Извините, произошла опечатка. Предполагается, что он равен 21. Но проблема все еще сохраняется.

3. Пожалуйста, обновите вопрос, чтобы показать 21.

Ответ №1:

Если у вас есть такая строка, то, возможно, проще создать свой собственный анализатор:

 int totalHours = 0;

// Demo time Strings         
String[] stringTimes = {"0 hours : 5 mins : 43 secs",
                        "2 hours : 25 mins : 31 secs",
                        "1 hours : 06 mins : 14 secs",
                        "4 hours : 43 mins : 57 secs"};

// Iterate through all the demo time strings contained in array.    
for (String strgTime : stringTimes) {
    /* Parse the current time string into hour, minutes, seconds 
       (Letter case is ignored).    */
    String[] timeParts = strgTime.trim().split("(?i)\s hours\s :\s |\s mins\s :\s |\s secs\s ");

    /* Validate the fact that the split element at index 0 of
       timeParts[] which is to hold hours is indeed a string 
       representation of a Integer value.           */
    if (timeParts[0].matches("\d ")) {
       /* Yes, It is a string representation of a Integer value.
          Convert this String value to Integer type and add it 
          to totalHours.  */
        totalHours  = Integer.valueOf(timeParts[0]);
    }
}

// Display Total Hours in console
System.out.println("Total Hours:t"   totalHours   " Hours");
  

После запуска этого вы должны увидеть в окне консоли: Total Hours: 7 Hours . Если вы удалите комментарии и демонстрационный массив string times, вы увидите, что на самом деле это не очень много кода.

Ответ №2:

java.time.Длительность в течение определенного периода времени

Я так понимаю, что 0 hours : 5 mins : 312 secs это промежуток времени (равный 10 минутам 12 секундам или в общей сложности 612 секундам). Сейчас не время суток. Если это так, правильный класс для использования Duration . ( LocalTime для времени суток, такого как 00:10:12, когда это означает 10 минут 12 секунд после полуночи.)

К сожалению, java.time не включает в себя какой-либо механизм для анализа строк произвольной длительности. Duration Класс может анализировать строки длительности в формате ISO 8601, и все. К счастью, для большинства форматов можно преобразовать полученную строку длительности в ISO 8601 с помощью регулярного выражения. Это так и в вашем случае.

Формат ISO 8601 для длительностей немного своеобразен, пока вы к нему не привыкнете. Это выглядит PT0H5M312S так. Думайте об этом как о периоде времени в 0 часов 5 минут 312 секунд.

     String amountOfTimeAsString = "0 hours : 5 mins : 312 secs";
    String iso8601String = "PT"    amountOfTimeAsString.replaceAll(
            "(\d )\s*(h)ours?\s*:\s*(\d )\s*(m)ins?\s*:\s*(\d )\s*(s)ecs?",
            "$1$2$3$4$5$6");
    Duration dur = Duration.parse(iso8601String);
    System.out.println(dur);
  

Вывод также в формате ISO 8601:

PT10M12S

Период времени 10 минут 12 секунд.

У A Duration есть plus метод для сложения длительностей вместе. Похоже, это то, что вам нужно для их суммирования. Для получения часов из суммы используйте toHours метод.

Ответ №3:

Вам нужно было использовать a LocalTime вместо a LocalDate , и в вашем формате ввода были ошибки.

Вот мои результаты тестирования.

 00:05:43
02:25:31
01:06:14
04:43:57
  

Вот пример кода, который я использовал. Спасибо @DevilsHnd за входной String массив.

 import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

public class DurationConve3rsion {

    public static void main(String[] args) {
        String[] stringTimes = { "0 hours : 5 mins : 43 secs", 
                "2 hours : 25 mins : 31 secs",
                "1 hours : 06 mins : 14 secs", 
                "4 hours : 43 mins : 57 secs" };

        DateTimeFormatter parser = DateTimeFormatter.ofPattern(
                "H 'hours :' m 'mins :' s 'secs'", Locale.US);

        for (String k : stringTimes) {
            LocalTime odt = LocalTime.parse(k, parser);

            DateTimeFormatter formatter = 
                    DateTimeFormatter.ofPattern("HH:mm:ss");
            String printDate = formatter.format(odt);
            System.out.println(printDate);
        }
    }

}