Основная проблема заключается в том, что LocalTime
- это только представление времени между полуночью и полуночью, оно не имеет понятия о каком-либо диапазоне за этими пределами.
Что вам действительно нужно, так это значение даты, связанное со значением времени, это позволит вам рассчитать продолжительность за пределами 24-часового периода.
В противном случае вам нужно будет «выдумать» значения самостоятельно. Это означает, что когда следующее время будет меньше предыдущего, вам нужно будет вручную добавить дополнительный период, может быть, сутки.
Есть, вероятно, несколько способов сделать это, это только один.
Он принимает ZonedDateTime
(установленное на текущую дату) и использует его как дату «привязки». Затем к этому применяется каждый Time
расписания. Когда он обнаруживает, что последнее время прибытия предшествует следующему времени отправления, он добавляет к значениям день.
import java.time.Duration;
import java.time.LocalTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[] args) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HHmm");
List<Schedule> route = new ArrayList<>(4);
route.add(new Schedule(LocalTime.parse("1139", formatter), LocalTime.parse("1435", formatter)));
route.add(new Schedule(LocalTime.parse("0906", formatter), LocalTime.parse("1937", formatter)));
route.add(new Schedule(LocalTime.parse("0804", formatter), LocalTime.parse("1521", formatter)));
// Anchor time...
ZonedDateTime zdt = ZonedDateTime.now(ZoneId.of("UTC"));
ZonedDateTime lastArrival = null;
Duration totalDuration = Duration.ZERO;
for (Schedule schedule : route) {
ZonedDateTime depart = zdt.with(schedule.getDepart());
ZonedDateTime arrive = zdt.with(schedule.getArrive());
if (lastArrival != null) {
if (lastArrival.isAfter(depart)) {
// Most likely, we've shifted to a new day...
// Updat the anchor and target values
zdt = zdt.plusDays(1);
depart = depart.plusDays(1);
arrive = arrive.plusDays(1);
}
Duration duration = Duration.between(lastArrival, depart);
totalDuration = totalDuration.plus(duration);
System.out.println("...Wait for " + duration.toHoursPart() + "h " + duration.toMinutesPart() + "m");
}
Duration duration = Duration.between(depart, arrive);
System.out.println(duration.toHoursPart() + "h " + duration.toMinutesPart() + "m");
totalDuration = totalDuration.plus(duration);
lastArrival = arrive;
}
System.out.println("Total duration of " + totalDuration.toHoursPart() + "d " + totalDuration.toHoursPart() + "h " + totalDuration.toMinutesPart() + "m");
}
public static class Schedule {
private LocalTime depart;
private LocalTime arrive;
public Schedule(LocalTime depart, LocalTime arrive) {
this.depart = depart;
this.arrive = arrive;
}
public LocalTime getDepart() {
return depart;
}
public LocalTime getArrive() {
return arrive;
}
}
}
Что выведет...
2h 56m
...Wait for 18h 31m
10h 31m
...Wait for 12h 27m
7h 17m
Total duration of 3d 3h 42m
Но зачем это делать? Потому что манипулирование датой/временем — это полный бардак, с високосными секундами, годами и другими глупыми правилами, которые призваны не дать им развалиться в хаос (вот почему в 12:00
нет полетов :/) ... и не надо. чтобы я начал с летнего времени...
API даты/времени Java позаботится обо всем этом за нас.
Я решил сохранить информацию о дате/времени в единой единице работы, то есть в формате UTC, что позволяет всем значениям иметь какое-то полезное значение. Вы можете легко использовать другое время привязки, а также преобразовать его в другой часовой пояс для использования в презентации, чтобы вы могли отображать время по местному времени в пункте назначения, но расчеты по-прежнему выполнялись бы относительно одной точки истины.
person
MadProgrammer
schedule
12.11.2018
LocalDateTime
, который позволяет переходить от одного дня к другому. - person MadProgrammer   schedule 12.11.2018ZonedDateTime
, так как вы можете перемещаться между разными часовыми поясами, делая вычисления довольно ... странными: P (нередко прибываете до того, как вы уехали ????) - person MadProgrammer   schedule 12.11.2018between
ясен следующий вопрос: количество времени между темпоральными1Inclusive и темпоральными2Exclusive с точки зрения этой единицы; положительна, если временное значение2Exclusive позже, чем временное значение1Inclusive, отрицательно, если раньше. Вы можете захотеть, чтобы на выходе было 19 часов, но на самом деле это 5 часов с отрицательным значением, как и должно быть. (А 24 - 5 это 19....) - person Erwin Bolwidt   schedule 12.11.2018