Как получить продолжительность, вычитая время прибытия за время отправления на Java с использованием григорианского календаря?

Допустим, мне нужно вычесть время прибытия на время отправления в определенные дни. Как бы я сделал это на Java, используя григорианский календарь?

public Duration getDuration(){
  SimpleDateFormat date = new SimpleDateFormat("YYYYMMDD");
  SimpleDateFormat time = new SimpleDateFormat("HHMM");

  String ArivalTime = "1720"
  String DepartingTime = "1100"
  String ArivalDate = "20200220"
  String DepartingDate = "20200211"

  Calendar departureDateCalc = new GregorianCalendar();


  //return duration;
}

код почти ничего. Но мне нужно вычесть дату прибытия по дате отъезда


person Noman Sheikh    schedule 08.02.2020    source источник
comment
Используйте java.time. В нем есть все, что вам нужно.   -  person akuzminykh    schedule 08.02.2020
comment
См. stackoverflow.com /вопросы/27005861/   -  person Joakim Danielson    schedule 08.02.2020
comment
посмотрите на этот stackoverflow .com/questions/1555262/   -  person HaMi    schedule 08.02.2020
comment
Я рекомендую вам не использовать SimpleDateFormat и GregorianCalendar. Эти классы плохо спроектированы и давно устарели, а первые, как известно, доставляют много хлопот. Вместо этого используйте LocalDate, LocalTime, DateTimeFormatter и другие классы из java.time, современной даты и времени Java. API.   -  person Ole V.V.    schedule 08.02.2020
comment
Во-первых, буквы шаблона формата чувствительны к регистру. Пожалуйста, проверьте еще раз, нужны ли вам прописные YYYY или строчные yyyy и т. д.   -  person Ole V.V.    schedule 08.02.2020
comment
В каком часовом поясе время вылета? И в каком часовом поясе время прибытия?   -  person Ole V.V.    schedule 08.02.2020


Ответы (1)


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