Вычислить дни между двумя датами в Java 8

Я знаю, что есть много вопросов о том, как получить, но я хочу и пример, используя новую Java 8 Date api. Я также знаю библиотеку JodaTime, но я хочу работать без внешних библиотек.

Функция должна жаловаться на эти ограничения:

  • Предотвращение ошибок с даты savetime
  • Ввод - это два объекта Date (без времени, я знаю localdatetime, но мне нужно делать с экземплярами даты)

Ответ 1

Если вам нужны логические календарные дни, используйте метод DAYS.between() из java.time.temporal.ChronoUnit:

LocalDate dateBefore;
LocalDate dateAfter;
long daysBetween = DAYS.between(dateBefore, dateAfter);

Если вы хотите буквальные 24-часовые дни (продолжительность), вместо этого вы можете использовать класс Duration :

LocalDate today = LocalDate.now()
LocalDate yesterday = today.minusDays(1);
// Duration oneDay = Duration.between(today, yesterday); // throws an exception
Duration.between(today.atStartOfDay(), yesterday.atStartOfDay()).toDays() // another option

Для получения дополнительной информации см. этот документ.

Ответ 2

Основываясь на комментариях VGR, вы можете использовать:

ChronoUnit.DAYS.between(firstDate, secondDate)

Ответ 3

Вы можете использовать until():

LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4);
LocalDate christmas = LocalDate.of(2014, Month.DECEMBER, 25);

System.out.println("Until christmas: " + independenceDay.until(christmas));
System.out.println("Until christmas (with crono): " + independenceDay.until(christmas, ChronoUnit.DAYS));

Ответ 4

Вы можете использовать DAYS.between от java.time.temporal.ChronoUnit

например.

import java.time.temporal.ChronoUnit;

public long getDaysCountBetweenDates(LocalDate dateBefore, LocalDate dateAfter) {
    return DAYS.between(dateBefore, dateAfter);
}

Ответ 5

  Если starDate и endDate являются экземпляром java.util.Date

ниже мы можем использовать метод Между() из java.time.temporal.ChronoUnit enum

public long between(Temporal temporal1Inclusive, Temporal temporal2Exclusive) {
    //..
}

ChronoUnit.DAYS считать дни, которые завершили 24 часа.

ChronoUnit.DAYS.between(startDate.toInstant(), endDate.toInstant());

//OR 

ChronoUnit.DAYS.between(Instant.ofEpochMilli(startDate.getTime()), Instant.ofEpochMilli(endDate.getTime()));

Ответ 6

Используйте DAYS в перечислении java.time.temporal.ChronoUnit. Ниже приведен пример кода:

Выход: * Количество дней между датой начала: 2015-03-01 и датой окончания: 2016-03-03 is == > 368. ** Количество дней между датой начала: 2016-03-03 и датой окончания: 2015-03-01 is == > -368 *

package com.bitiknow.date;

import java.time.LocalDate;
import java.time.temporal.ChronoUnit;

/**
 * 
 * @author pradeep
 *
 */
public class LocalDateTimeTry {
    public static void main(String[] args) {

        // Date in String format.
        String dateString = "2015-03-01";

        // Converting date to Java8 Local date
        LocalDate startDate = LocalDate.parse(dateString);
        LocalDate endtDate = LocalDate.now();
        // Range = End date - Start date
        Long range = ChronoUnit.DAYS.between(startDate, endtDate);
        System.out.println("Number of days between the start date : " + dateString + " and end date : " + endtDate
                + " is  ==> " + range);

        range = ChronoUnit.DAYS.between(endtDate, startDate);
        System.out.println("Number of days between the start date : " + endtDate + " and end date : " + dateString
                + " is  ==> " + range);

    }

}

Ответ 7

Все говорят использовать ChronoUnit.DAYS.between, но это просто передает другой метод, который вы могли бы назвать самим собой. Таким образом, вы также можете сделать firstDate.until(secondDate, ChronoUnit.DAYS).

Документы для обоих фактически упоминают оба подхода и говорят, чтобы использовать то, что более читаемо.

Ответ 8

Здесь вы идете:

public class DemoDate {
    public static void main(String[] args) {
        LocalDate today = LocalDate.now();
        System.out.println("Current date: " + today);

        //add 1 month to the current date
        LocalDate date2 = today.plus(1, ChronoUnit.MONTHS);
        System.out.println("Next month: " + date2);

        // Put latest date 1st and old date 2nd in 'between' method to get -ve date difference
        long daysNegative = ChronoUnit.DAYS.between(date2, today);
        System.out.println("Days : "+daysNegative);

        // Put old date 1st and new date 2nd in 'between' method to get +ve date difference
        long datePositive = ChronoUnit.DAYS.between(today, date2);
        System.out.println("Days : "+datePositive);
    }
}

Ответ 9

Получите количество дней до Рождества с текущего дня, попробуйте это

System.out.println(ChronoUnit.DAYS.between(LocalDate.now(),LocalDate.of(Year.now().getValue(), Month.DECEMBER, 25)));

Ответ 10

получить дни между двумя датами даты - экземпляр java.util.Date

public static long daysBetweenTwoDates(Date dateFrom, Date dateTo) {
            return DAYS.between(Instant.ofEpochMilli(dateFrom.getTime()), Instant.ofEpochMilli(dateTo.getTime()));
        }

Ответ 11

Если цель состоит только в том, чтобы получить разницу в днях, и поскольку вышеупомянутые ответы упоминают о методах делегатов, то хотелось бы отметить, что однажды можно также просто использовать -

public long daysInBetween(java.time.LocalDate startDate, java.time.LocalDate endDate) {
  // Check for null values here

  return endDate.toEpochDay() - startDate.toEpochDay();
}

Ответ 12

Я знаю, что этот вопрос относится к Java 8, но с Java 9 вы можете использовать:

public static List<LocalDate> getDatesBetween(LocalDate startDate, LocalDate endDate) {
    return startDate.datesUntil(endDate)
      .collect(Collectors.toList());
}

Ответ 13

Используйте класс или метод, который наилучшим образом соответствует вашим потребностям:

  • класс продолжительности,
  • Период класс,
  • или метод ChronoUnit.between.

Длительность измеряет количество времени, используя значения на основе времени (секунды, наносекунды).

Период использует значения на основе даты (годы, месяцы, дни).

Метод ChronoUnit.between полезен, когда вы хотите измерить количество времени только в одной единице времени, например, днях или секундах.

https://docs.oracle.com/javase/tutorial/datetime/iso/period.html