Рассчитать количество дней между двумя датами в Java [дубликат]

этот вопрос уже есть ответ здесь:

Мне нужно вычислить количество дней между двумя датами, и я использую ниже код. проблема в том, что он возвращает мне 2, но на самом деле он должен вернуть 3, потому что разница между 30 июня 2016 года и 27 июня составляет 3. Вы можете пожалуйста, помогите, где он должен включать текущую дату, а также в разнице?

public static long getNoOfDaysBtwnDates(String expiryDate) {
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
    Date expDate = null;
    long diff = 0;
    long noOfDays = 0;
    try {

        expDate = formatter.parse(expiryDate);
        //logger.info("Expiry Date is " + expDate);
       // logger.info(formatter.format(expDate));

        Date createdDate = new Date();
        diff = expDate.getTime() - createdDate.getTime();
        noOfDays = TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS);
        long a = TimeUnit.DAYS.toDays(noOfDays);
       // logger.info("No of Day after difference are - " + TimeUnit.DAYS.convert(diff, TimeUnit.MILLISECONDS));
        System.out.println(a);
        System.out.println(noOfDays);

    } catch (ParseException e) {
        e.printStackTrace();
    }

    return noOfDays;
}

срок годности 2016-06-30 и текущая дата 2016-06-27

4 ответов


причина в том, что вы не вычитаете две даты с одинаковым форматом времени.

использовать класс Calendar, чтобы изменить время 00:00:00 для даты и вы получите точную разницу в днях.

Date createdDate = new Date();
Calendar time  = Calendar.getInstance();
time.set(Calendar.HOUR_OF_DAY, 0);
time.set(Calendar.MINUTE, 0);
time.set(Calendar.SECOND, 0);
time.set(Calendar.MILLISECOND, 0);
createdDate = time.getTime();

больше объяснений в Джим Гаррисон'ответ


почему бы не использовать LocalDate?

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

long diffInDays(LocalDate a, LocalDate b) {
  return DAYS.between(a, b);
}

проблема в том, что

Date createdDate = new Date();

наборы createdDate до текущий момент, то есть он включает в себя текущее время, а также дату. При разборе строки в заданном формате время инициализируется как 00:00:00.

допустим, вы запустили это ровно в 18: 00 по местному времени, вы в конечном итоге с

createdDate = 2016-06-27 18:00:00.000
expDate     = 2016-06-30 00:00:00.000

разница составляет 2 дня 6 часов, а не 3 дня.

вы должны использовать новые java.time.* классы из Java 8. Есть класс LocalDate что представляет даты без времени суток. Он включает в себя методы синтаксического анализа с использованием формата и LocalDate.now() чтобы получить текущую дату, а также методы расчета интервалов между LocalDate экземпляров.


С помощью Calendar.get(Calendar.DAY_OF_MONTH) как указано python:

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date expDate = null;
String expiryDate ="2016-06-30";
int diff = 0;
try {
    expDate = formatter.parse(expiryDate);
    //logger.info("Expiry Date is " + expDate);
    // logger.info(formatter.format(expDate));
    Calendar cal = Calendar.getInstance();
    int today = cal.get(Calendar.DAY_OF_MONTH);
    cal.setTime(expDate);
    diff = cal.get(Calendar.DAY_OF_MONTH)- today;

} catch (ParseException e) {
    e.printStackTrace();
}
System.out.println(diff);