#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);
}
}
}