2016-06-27 38 views
7

Ho bisogno di calcolare il numero di giorni tra due date e sto usando sotto il codice. il problema è che mi sta restituendo 2 ma in realtà dovrebbe restituire 3 perché la differenza tra il 30 giugno 2016 e il 27 giugno è 3. puoi aiutarmi dove dovrebbe includere anche la data corrente nella differenza?Calcola il numero di giorni tra due date in 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; 
} 

data di scadenza è 2016/06/30 e quella attuale è 2016-06-27

+0

@AngryJS Acquista la mia risposta! –

risposta

7

La ragione è, non si è sottrazione di due date con lo stesso formato dell'ora.

Utilizzare la classe di calendario per modificare l'ora come 00:00:00 per entrambe la data e si otterrà la differenza esatta in giorni.

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

Più spiegazione a Jim Garrison' answer

+0

L'ho appena fatto e distribuito :). – AngryJS

3

Il problema è che

Date createdDate = new Date(); 

insiemi createdDate alla istante attuale, cioè , include l'ora corrente e la data. Quando si analizza una stringa utilizzando il formato specificato, l'ora viene inizializzata su 00:00:00.

Diciamo che è stato eseguito questo esattamente 18:00 ora locale, si finisce con

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

La differenza è di 2 giorni 6 ore, non 3 giorni.

Si dovrebbero usare le classi più recenti java.time.* da Java 8. Esiste una classe LocalDate che rappresenta le date senza ora del giorno. Include metodi per l'analisi utilizzando un formato e LocalDate.now() per ottenere la data corrente, nonché i metodi per il calcolo degli intervalli tra le istanze LocalDate.

+0

Allora come posso ripararlo? in modo che se inserisco la scadenza il 30 giugno, dovrebbe dare il numero di giorni in cui solo 3, che effettivamente calcola la differenza tra le date e non il tempo. – AngryJS

+0

Vedere la mia risposta aggiornata. –

0

Utilizzando la Calendar.get(Calendar.DAY_OF_MONTH) come sottolineato da pitone:

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

Soluzione semplice ed elegante ma il metodo getDay è obsoleto dal jdk6. Deprecato. A partire da JDK versione 1.1, sostituito da Calendar.get (Calendar.DAY_OF_MONTH). – PyThon

+0

modificato la mia risposta –

+0

sembra bene ora, cal.setTime (expDate), questo è stato bello! – PyThon

5

Perché non usare LocalDate?

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

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