Newsgroup: it.comp.java
Titolo: aiuto problemma con le Date

Salve a tutti,
devo stabilire quanti giorni mancano ad una determinata data.
Es. se oggi è 25/03/04, quanti giorni mancano al 06/04/04?
Devo utilizzare l'oggetto Date() ?
Grazie
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 ha scritto nel messaggio
news:80Z68Z200Z146Y1...@usenet.libero.it...
| Salve a tutti,
|
| devo stabilire quanti giorni mancano ad una determinata data.
|
| Es. se oggi è 25/03/04, quanti giorni mancano al 06/04/04?
|
| Devo utilizzare l'oggetto Date() ?
Calendar c1 = new java.util.GregorianCalendar(2004,3,25);
Calendar c2 = new java.util.GregorianCalendar(2004,4,6);
float delta_giorni = (c2.getTimeInMillis()-
       c1.getTimeInMillis())/(1000*60*60*24);
Ciao,
GianpieroP
-----BEGIN PGP SIGNATURE-----
Version: PGP 8.0
iQA/AwUBQGNMrp4sPKh9SaicEQJ/zgCeMpQkaLbf7Wlej4UzTLL02HaMX9YAn1vo
rUUUy1fRFoawfyyzgc6hPksu
=KoG0
-----END PGP SIGNATURE-----

        c1.getTimeInMillis())/(1000*60*60*24);
La soluzione proposta ha due problemi:
 -1- Non riferisce le date di 25/03/04 e di 06/04/04
              bensì quelle di 25/04/04 e di 06/05/04
 -2- L'algoritmo proposto non funziona quando l'intervallo di date
     richiesto comprenda un cambiamento da ora solare a ora legale.
Un algoritmo corretto può essere trovato qui:
http://groups.google.com/groups?selm=b7j5kq%24p7b%241%40fata.cs.interbusiness.it
- Dario

 ha scritto nel messaggio
news:47cc3bd0.04032...@posting.google.com...
Quella del mese (0 based indexing) già la sapevo e l'ho dimenticato.
Ma quella dell'ora solare non ci avevo mai pensato!
Grazie.
| Un algoritmo corretto può essere trovato qui:
| 
http://groups.google.com/groups?selm=b7j5kq%24p7b%241%40fata.cs.inte
| 
rbusiness.it
Andro' a consultare.
GianpieroP
-----BEGIN PGP SIGNATURE-----
Version: PGP 8.0
iQA/AwUBQGVNip4sPKh9SaicEQLfKACeP8IIaoB3Rqhbuu663MC6Mf5PloMAniS7
LQmEup/+iRHGKeJ+VE+2LVEC
=KgLM
-----END PGP SIGNATURE-----


http://groups.google.com/groups?selm=b7j5kq%24p7b%241%40fata.cs.interbusiness.it
Spiacente, ma cliccando sull'URL non riesco a trovarlo.
Puoi sintetizzare tu direttamente?
Grazie,
GianpieroP


 Puoi sintetizzare tu direttamente?
Ti copio il programmino (comprensivo di test di esempio)
che risolve sempre e correttamente il problema di fornire
la differenza in giorni tra due date.
- 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);
     }
   }
}

 ha scritto nel messaggio
news:47cc3bd0.04032...@posting.google.com...
| 
http://groups.google.com/groups?selm=b7j5kq%24p7b%241%40fata.cs.inte
| 
rbusiness.it

Eeeh! E tu vorresti utilizzare questo po' po' di roba solo
per correggere il problema dell'ora legale!
Questo algoritmo IMHO è pessimo in
efficienza computazionale, leggibilità e
semplicità.
BTW, grazie alla tua osservazione ho corretto l'algoritmo che
avevo proposto introducendo la correzione dell'OFFSET
dovuto all'ora legale:
float delta_giorni =
   ( c2.getTimeInMillis() +
     c2.get(java.util.Calendar.DST_OFFSET) -
     c1.getTimeInMillis() -
     c1.get(java.util.Calendar.DST_OFFSET)
    ) / (1000*60*60*24);
Grazie ancora.
Ciao,
GianpieroP
-----BEGIN PGP SIGNATURE-----
Version: PGP 8.0
iQA/AwUBQGnZ2p4sPKh9SaicEQI2WwCg6UVwXdcqUcUbnOoA6nP1SvYhtQYAoIVM
3FBwQHrj50CCfF0uVa7kw8uz
=32hC
-----END PGP SIGNATURE-----

     ) / (1000*60*60*24);
Quando hai ragione... hai ragione.
Mi cospargo il capo di cenere!
Ho riscritto così la mia personale copia del metodo
che fornisce la differenza fra due Date d1 e d2:
    public static long getDiffDays(Date d1, Date d2) {
      GregorianCalendar c1 = new GregorianCalendar();
      GregorianCalendar c2 = new GregorianCalendar();
      c1.setTime(d1);
      c2.setTime(d2);
      return ( c2.getTimeInMillis() +
               c2.get(java.util.Calendar.DST_OFFSET) -
               c1.getTimeInMillis() -
               c1.get(java.util.Calendar.DST_OFFSET)
              ) / (1000*60*60*24);
    }
Anche oggi ho imparato qualcosa.
- Dario

 Es. se oggi è 25/03/04, quanti giorni mancano al 06/04/04?
Vedi 
http://groups.google.com/groups?selm=b7j5kq%24p7b%241%40fata.cs.interbusiness.it
- Dario