2016-06-27 5 views
7

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

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

+0

@AngryJS Оформить заказ мой ответ! –

ответ

7

Причина, вы не вычитание двух дат с же форматом.

Используйте календарь, чтобы изменить время как 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(); 

Больше объяснений в Джим Гаррисон»answer

+0

Просто сделал это и развернул :). – AngryJS

3

Проблема заключается в том, что

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 экземплярами.

+0

Тогда как я могу это исправить? так что, если я вступлю в истечение 30 июня, это должно дать количество дней как 3, только то, что фактически вычисляет разницу между датами, а не временем. – AngryJS

+0

См. Мой обновленный ответ. –

0

Используя Calendar.get(Calendar.DAY_OF_MONTH) как указал питон:

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); 
+1

Ницца и элегантное решение, но метод getDay устарел с jdk6. Устаревшее. Начиная с версии JDK версии 1.1, заменяемой Calendar.get (Calendar.DAY_OF_MONTH). – PyThon

+0

отредактировал мой ответ –

+0

выглядит хорошо сейчас, cal.setTime (expDate), это было круто! – PyThon

5

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

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

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