Newsgroup: it.comp.java
Titolo: Differenza fra due date

Ho bisogno di sapere quanti giorni sono passati da una certa data (l'ora 
del giorno non mi interessa, voglio sapere ad esempio quanti giorni ci 
sono passati dal 03/03/2003 al 14/04/2003 e la risposta deve essere 42).
Molti mi diranno:
(data1.getTime() - data2.getTime())/MILLISECONDI_IN_UN_GIORNO
Peccato che non funzioni.
Infatti il numero di millisecondi in un giorno non è costante a causa 
dell'ora legale (ne caso portato come esempio la risposta sarebbe 41 
poiche' alla mezzanotte del 14/04/2003 sono passati 41 giorni e 23 ore 
dalla mezzanotte del 03/03).
Per di piu', non so bene il motivo ma sembra che intorno al 1975 si sia 
saltata un'ora (comunque questo non mi interessa, le mie date sono tutte 
recenti).
Qualcuno ha una soluzione semplice?
Andrea Polci

 dalla mezzanotte del 03/03).
Puoi provare a fare in questo modo: aggiungi un'ora alla seconda data. 
Esegui il calcolo di cui sopra e utilizza Math.ceil() per ricavare un 
numero intero.
Funziona solo se gli unici due fusi orari utilizzati hanno fra di loro 
una differenza di un'ora (oppure sono lo stesso fuso).
Gaetano Bigliardi

 Infatti il numero di millisecondi in un giorno non č costante a causa


 sono passati dal 03/03/2003 al 14/04/2003 e la risposta deve essere 42).
Vedi 
http://pws.prserv.net/ad/programs/Programs.html#DateDiff
Sembra ben fatta, completa e semplice.
- Dario


Purtroppo non tiene conto del problema con l'ora solare. Nel mio caso da 
come risposta 41 poiche' fra le due date sono passati 41 giorni e 23 ore 
(il 14/04/2003 c'e' l'ora solare).
Grazie lo stesso.
Andrea Polci

 (il 14/04/2003 c'e' l'ora solare).
Ovviamente volevo dire ora legale e non ora solare.
Andrea Polci


La seguente classe ritorna esattamente quanto ti aspetti.
- Dario
import java.util.*;
import java.text.*;
class A25 {
   // return d2-d1 in days
   public static int getDiffDays(Date d1, Date d2) {
     GregorianCalendar c1 = new GregorianCalendar();
     GregorianCalendar c2 = new GregorianCalendar();
     c1.setTime(d1);
     c2.setTime(d2);
     if(c1.getGregorianChange().after(d1) ||
        c2.getGregorianChange().after(d2))
       throw new IllegalArgumentException("dates < GregorianChange");
     if(c1.get(Calendar.YEAR) == c2.get(Calendar.YEAR))
       return c2.get(Calendar.DAY_OF_YEAR)-c1.get(Calendar.DAY_OF_YEAR);
     boolean neg = d1.after(d2);
     if(neg) {
       GregorianCalendar temp = c1;
       c1 = c2;
       c2 = temp;
     }
     int sum = 0;
     for(int i=c1.get(Calendar.YEAR)+1;i<=c2.get(Calendar.YEAR)-1;i++) {
       sum += 365;
       if(c1.isLeapYear(i))
         sum++;
     }
     GregorianCalendar c0= new GregorianCalendar(c1.get(Calendar.YEAR),
                                                 Calendar.DECEMBER, 31);
     sum += c0.get(Calendar.DAY_OF_YEAR) - c1.get(Calendar.DAY_OF_YEAR)
            + c2.get(Calendar.DAY_OF_YEAR);
     return neg ? -sum : sum;
   }
   // some test code...
   public static void test(int y1, int m1, int d1,
                           int y2, int m2, int d2,
                           int expected) {
     SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
     GregorianCalendar c1 = new GregorianCalendar(y1, m1, d1);
     GregorianCalendar c2 = new GregorianCalendar(y2, m2, d2);
     System.out.println(sdf.format(c1.getTime()) + " - " +
                        sdf.format(c2.getTime()) + " = " +
                        getDiffDays(c1.getTime(), c2.getTime()) +
                        " expexted = " + expected);
   }
   public static void main(String args[]) {
     test(2003, Calendar.MARCH, 3, 2003, Calendar.APRIL, 14, 42);
     test(2003, Calendar.APRIL, 14, 2003, Calendar.MARCH, 3, -42);
     test(2003, Calendar.MARCH, 29, 2003, Calendar.MARCH, 29, 0);
     test(2003, Calendar.MARCH, 29, 2003, Calendar.MARCH, 30, 1);
     test(2004, Calendar.DECEMBER, 31, 2005, Calendar.JANUARY, 1, 1);
     test(2003, Calendar.DECEMBER, 31, 2004, Calendar.JANUARY, 1, 1);
     test(2002, Calendar.DECEMBER, 31, 2003, Calendar.JANUARY, 1, 1);
     test(2004, Calendar.JANUARY, 1, 2005, Calendar.JANUARY, 1, 366);
     test(2003, Calendar.JANUARY, 1, 2004, Calendar.JANUARY, 1, 365);
     test(2002, Calendar.MARCH, 3, 2003, Calendar.MARCH, 3, 365);
     test(2003, Calendar.MARCH, 3, 2002, Calendar.MARCH, 3, -365);
     test(2003, Calendar.MARCH, 3, 2004, Calendar.MARCH, 3, 366);
     test(2004, Calendar.MARCH, 3, 2003, Calendar.MARCH, 3, -366);
     test(2004, Calendar.MARCH, 3, 2005, Calendar.MARCH, 3, 365);
     test(2005, Calendar.MARCH, 3, 2004, Calendar.MARCH, 3, -365);
     test(1958, Calendar.APRIL, 4, 2003, Calendar.APRIL, 4, 16436);
     // here an IllegalArgumentException expected
     try {
       test(1582, Calendar.OCTOBER, 4, 1582, Calendar.OCTOBER, 15, 0);
     } catch(IllegalArgumentException iae) {
       System.out.println("Expected and Catch "+iae);
     }
   }
}