Как рассчитать разницу дат? - PullRequest
1 голос
/ 25 февраля 2020

Я использую класс java.util.Date и хочу сравнить объект Date и текущее время. Выходной формат

должен быть таким:

... years , ... months , ... days , ...hours , ... minutes , ... seconds.

это мой код:

public static void main(String[] args) {
    Calendar calendar = new GregorianCalendar(2022, 1 , 25 , 12 , 20 , 33);
    Date now = new Date(); //Tue Feb 25 11:49:05 IRST 2020
    Date date = calendar.getTime(); //Fri Feb 25 12:20:33 IRST 2022
}

Есть ли простой способ рассчитать это?

Ответы [ 3 ]

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

java.time и почему и как его использовать

Для разницы в годах, месяцах и днях есть java.time.Period, который вы можете легко используйте, чтобы получить то, что вы хотите:

public static void main(String[] args) {
    LocalDateTime localDateTime = LocalDateTime.of(2022, 1 , 25 , 12 , 20 , 33);
    LocalDateTime now = LocalDateTime.now();

    // get the difference in years, months and days
    Period p = Period.between(now.toLocalDate(), localDateTime.toLocalDate());

    // and print the result(s)
    System.out.println("Difference between " + localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            + " and " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + " is:\n"
            + p.getYears() + " years, " + p.getMonths() + " months, " + p.getDays() + " days");
}

Вывод этого примера кода будет (в зависимости от текущего дня, конечно):

Difference between 2022-01-25T12:20:33 and 2020-02-25T10:52:43.327 is:
1 years, 11 months, 0 days

Вы можете использовать java.time.Duration как показано в одном из других ответов, чтобы получить дополнительную разницу в часах, минутах и ​​секундах. См. Этот пример (который в основном является приведенным выше, плюс расчет времени):

public static void main(String[] args) {
    LocalDateTime localDateTime = LocalDateTime.of(2022, 1 , 25 , 12 , 20 , 33);
    LocalDateTime now = LocalDateTime.now();

    // get the difference in years, months and days (date related difference)
    Period p = Period.between(now.toLocalDate(), localDateTime.toLocalDate());
    // and the difference in hours, minutes and seconds (time-of-day related difference)
    Duration d = Duration.between(now.toLocalTime(), localDateTime.toLocalTime());
    long totalSeconds = d.getSeconds();
    long hours = totalSeconds / 3600;
    long minutes = (totalSeconds % 3600) / 60;
    long seconds = totalSeconds % 60;

    // and print the result(s)
    System.out.println("Difference between " + localDateTime.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
            + " and " + now.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + " is:\n"
            + p.getYears() + " years, " + p.getMonths() + " months, " + p.getDays() + " days, "
            + hours + " hours, " + minutes + " minutes, " + seconds + " seconds");
}

Вывод:

Difference between 2022-01-25T12:20:33 and 2020-02-25T11:25:42.712 is:
1 years, 11 months, 0 days, 0 hours, 54 minutes, 50 seconds

Если вы получаете java.util.Date s или расширяете устаревший код (или если вам просто лень изменить весь код на использование java.time), вы можете использовать следующие методы совместимости:

LocalDateTime fromDate = LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
Date fromLocalDateTime = Date.from(LocalDateTime.now().toInstant((ZoneOffset.UTC)));
2 голосов
/ 25 февраля 2020

Java 8 API даты / времени гибко сравнивает даты.

Пример:

LocalDate currentDate = LocalDate.now();
LocalDate previousDate = LocalDate.of(2000, 7, 1);

Period period = Period.between(previousDate, currentDate);

String output = String.format("%s years , %s months , %s days",
                period.getYears(), period.getMonths(), period.getDays());

System.out.println(output);   
> 19 years , 7 months , 24 days

Еще пример здесь .

Это может помочь вам, если вы хотите выбрать между Period или Duration.

0 голосов
/ 25 февраля 2020

Использование java Мгновенное действие

Instant start, end;
Duration duration = Duration.between(start, stop);
long hours = dur.toHours();
long minutes = dur.toMinutes();
...