Расчет дней между двумя датами в Java 8

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

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

  1. предотвращение ошибок с даты сохранения
  2. Input-это два объекта даты (без времени, я знаю localdatetime, но мне нужно делать с экземплярами даты)

9 ответов


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

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

если вы хотите литерал 24 часа в сутки, (a продолжительность), вы можете использовать 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

для получения дополнительной информации см. документ (и другие документы re: Java 8 от Oracle).


на основе комментариев VGR вот что вы можете использовать:

ChronoUnit.DAYS.between(firstDate, secondDate)

можно использовать 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));

можно использовать DAYS.between С java.time.temporal.ChronoUnit

например

import java.time.temporal.ChronoUnit;

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

используйте дни в перечислении java.время.временной.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);

    }

}

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

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);
    }
}

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

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


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

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

получить дни между двумя датами дата является экземпляром java.утиль.Дата

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