Как получить длительность, вычитая время прибытия из времени отправления в Java по григорианскому календарю? - PullRequest
0 голосов
/ 08 февраля 2020

Допустим, я должен вычесть время прибытия, отправляя время, указанное в c дней. Как бы я сделал это в 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;
}

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

1 Ответ

3 голосов
/ 08 февраля 2020

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.

...