it-swarm.com.ru

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

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

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

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

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

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

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

Для получения дополнительной информации обратитесь к этому документу (и другим документам, касающимся Java 8 от Oracle).

295
syntagma

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

ChronoUnit.DAYS.between(firstDate, secondDate)
93
Sunil B

Вы можете использовать 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));
29
nazar_art

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

например.

import Java.time.temporal.ChronoUnit;

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

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

Вывод: * Количество дней между датой начала: 2015-03-01 и датой окончания: 2016-03-03: ==> 368 . ** Количество дней между датой начала : 2016-03-03 и дата окончания: 2015-03-01 = => -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);

    }

}
5
Pradeep Padmarajaiah

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

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

5
nafg

Ну вот:

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

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

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

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

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

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

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

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

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

Integer noOfDays = ChronoUnit.DAYS.between(startDate.toInstant(), endDate.toInstant());

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

0
Pawan

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

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