java .time
Не используйте GregorianCalendar
для этого. Используйте java .time, современный Java API даты и времени.
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HHmm");
String arrivalTime = "1720";
String departingTime = "1100";
String arrivalDate = "20200220";
String departingDate = "20200211";
String arrivalTimeZone = "Africa/Niamey";
String departingTimeZone = "America/Mendoza";
ZonedDateTime departure = LocalDate.parse(departingDate, DateTimeFormatter.BASIC_ISO_DATE)
.atTime(LocalTime.parse(departingTime, timeFormatter))
.atZone(ZoneId.of(departingTimeZone));
ZonedDateTime arrival = LocalDate.parse(arrivalDate, DateTimeFormatter.BASIC_ISO_DATE)
.atTime(LocalTime.parse(arrivalTime, timeFormatter))
.atZone(ZoneId.of(arrivalTimeZone));
Duration difference = Duration.between(departure, arrival);
System.out.println(difference);
Это выводит:
PT218H20M
Итак период времени 218 часов 20 минут. Если вы хотите, чтобы он был более читабельным:
String diffString = String.format(
"%d days %d hours %d minutes", difference.toDays(),
difference.toHoursPart(), difference.toMinutesPart());
System.out.println(diffString);
9 дней 2 часа 20 минут
Преобразование в дни предполагает, что день всегда равен 24 часам, что, возможно, не Это относится к часовому поясу отправления или прибытия, например, когда они go из стандартного в летнее время (DST) или наоборот.
Не используйте GregorianCalendar
Класс GregorianCalendar
плохо спроектирован и давно устарел. Не используйте это. Для всего. Если бы вы хотели использовать его для определения продолжительности, можно было бы добавить один день за один раз ко времени отправления, пока вы не достигнете времени прибытия. Если вы прошли, вычтите один день снова и начните считать часы, снова добавляя по одному за раз. То же самое с минутами. Это способ более сложный и также более подверженный ошибкам, чем использование класса Duration
напрямую.
Ссылка
Oracle учебник: Дата Время объясняя, как использовать java .time.