Java.время
Не используйте для этого GregorianCalendar
. Используйте java.time, современный API даты и времени Java.
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 часа, чего может не быть ни в часовом поясе отправления, ни в часовом поясе прибытия, например, при переходе со стандартного времени на летнее (DST) или наоборот.
Не используйте GregorianCalendar
Класс GregorianCalendar
плохо спроектирован и давно устарел. Не используйте его. Для всего. Если бы вы хотели использовать его для определения длительности, можно было бы добавлять по одному дню ко времени отправления, пока не достигнете времени прибытия. Если вы прошли его, снова вычтите один день и начните считать часы, снова прибавляя по одному. То же самое с минутами. Это намного сложнее, а также более подвержено ошибкам, чем непосредственное использование класса Duration
.
Связь
учебное пособие по Oracle: дата и время, объясняющее, как использовать java.time.
person
Ole V.V.
schedule
08.02.2020
SimpleDateFormat
иGregorianCalendar
. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйтеLocalDate
,LocalTime
,DateTimeFormatter
и другие классы из java.time, современной даты и времени Java. API. - person Ole V.V.   schedule 08.02.2020YYYY
или строчныеyyyy
и т. д. - person Ole V.V.   schedule 08.02.2020