Прежде всего, давайте ясно, что время 24:00 действительный ISO-8601-время. Цитирование из ISO-8601:
4.2 Time of day
4.2.1 General
This International Standard is based on the 24-hour timekeeping System
that is now in common use. In expressions of time of day
hour is represented by two digits from [00] to [24]. The representation
of the hour by [24] is only allowed to indicate the end of a calendar
day, see 4.2.3.
сам Java не поддерживает 24:00, если не используется режим снисходительны парсинга из SimpleDateFormat
. Но даже тогда поддержка недоступна, потому что если вы спросите результат (пример java.util.Date
) за час, когда вы получите нуль, как вы уже заметили. Подобные мысли действительны для java.util.GregorianCalendar
. После разбора нет возможности определить, был ли вход 24:00 или нет (не зная, какой исходный вход был).
Java-8 также не имеет реальной поддержки для этого специального часа. Лучшее, что вы можете здесь сделать, это использовать parseExcessDays(), применяемый к сырым разобранным данным DateTimeFormatter
. Вы можете использовать обходной путь, как это:
String input = "24:00:00";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("HH:mm:ss");
TemporalAccessor raw = dtf.parse(input);
int hour = raw.query(LocalTime::from).getHour();
Period period = raw.query(DateTimeFormatter.parsedExcessDays());
if (period.equals(Period.ofDays(1))) {
hour = 24;
}
System.out.println("iso-hour=" + hour); // output: iso-hour=24
Популярная третья сторона библиотека Joda времени не имеет поддержки 24:00. Ситуация аналогична SimpleDateFormat
.
Единственная библиотека со встроенной поддержкой, о которой я знаю, это Time4J, которую я написал сам. Полная поддержка ограничена PlainTime
(аналогичный кулон LocalTime
), недействительный для полных дат-представлений (где это было бы двойственным, временные метки, содержащие 24:00, будут автоматически нормализованы до следующего дня в 00:00):
PlainTime time = Iso8601Format.EXTENDED_WALL_TIME.parse("24:00:00");
System.out.println(time.get(PlainTime.ISO_HOUR)); // 24
Обратите внимание, что пространство состояний класса PlainTime
немного расширено, так что оно может удерживать это специальное значение времени ISO. Поэтому прямой доступ как записать программное это возможно:
PlainTime time24 = PlainTime.midnightAtEndOfDay(); // or: PlainTime.of(24, 0);
System.out.println(time24); // T24
Формат <0:24> не имеет никакого смысла. Или, если это так, <0:25>, или <0:26>, или <0:29293> и т. Д., Потому что все они перевернуты на 24-часовой лимит, так что все они одинаково «легальны». В формате 24-часовой синхронизации первая минута 00:00, а в последнюю минуту 23:59 Через минуту после 23:59 снова 00:00. 24:00 не существует – deyur
@ deyur ваше мышление hh, в котором часы 1-23, часы в kk 1-24. – UnknownOctopus
@UnknownOctopus Я думая о hh, потому что OP хочет, чтобы час начался в 0. Я согласен с вами в том, что kk часов 1-24, но это все равно не делает 0-24 законным (в любом формате). – deyur