Autore Topic: Differenza giorni tra date  (Letto 211 volte)

Offline capitancooker

  • Utente junior
  • **
  • Post: 123
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Differenza giorni tra date
« il: 15 Marzo 2018, 10:05:42 CET »
0
Ciao,
mi si presenta un curioso problema con il calcolo dei giorni che intercorrono tra due date.
Ho adottato questo codice, trovato su stackoverflow:
Codice (Java): [Seleziona]
    public static long getDaysDifferences(Date data1, Date data2) {
       
        Calendar sDate = toCalendar(data1.getTime());
        Calendar eDate = toCalendar(data2.getTime());

        // Get the represented date in milliseconds
        long milis1 = sDate.getTimeInMillis();
        long milis2 = eDate.getTimeInMillis();

        // Calculate difference in milliseconds
        long diff = Math.abs(milis2 - milis1);

        return (int) (diff / (24 * 60 * 60 * 1000));
    }


    private static Calendar toCalendar(long timestamp) {
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(timestamp);
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        return calendar;
    }
       

Poi ho scritto una banale routine per vederne il risultato:

Codice (Java): [Seleziona]
                Calendar enddate = Calendar.getInstance();
               
                for (int i=15;i<31;i++){
                        enddate.set(Calendar.DAY_OF_MONTH, i);
                        System.out.println(enddate.getTime() + " - " + getDaysDifferences(new Date(),enddate.getTime()));
                       
                }

Il risultato curioso, e quindi fonte di enormi problemi, si presenta dal 26 marzo che, come mostra l'output, è ancora 10 mentre dovrebbe essere 11:
Codice (Java): [Seleziona]
Thu Mar 15 09:51:16 CET 2018 - 0
Fri Mar 16 09:51:16 CET 2018 - 1
Sat Mar 17 09:51:16 CET 2018 - 2
Sun Mar 18 09:51:16 CET 2018 - 3
Mon Mar 19 09:51:16 CET 2018 - 4
Tue Mar 20 09:51:16 CET 2018 - 5
Wed Mar 21 09:51:16 CET 2018 - 6
Thu Mar 22 09:51:16 CET 2018 - 7
Fri Mar 23 09:51:16 CET 2018 - 8
Sat Mar 24 09:51:16 CET 2018 - 9
Sun Mar 25 09:51:16 CEST 2018 - 10
Mon Mar 26 09:51:16 CEST 2018 - 10
Tue Mar 27 09:51:16 CEST 2018 - 11
Wed Mar 28 09:51:16 CEST 2018 - 12
Thu Mar 29 09:51:16 CEST 2018 - 13
Fri Mar 30 09:51:16 CEST 2018 - 14

Sapete dare una spiegazione a questo bug? C'è un metodo più affidabile per calcolare i giorni tra due date?

Grazie in anticipo,
Marco


Post unito: 15 Marzo 2018, 10:24:28 CET
Ho capito l'origine del problema, il 26 marzo inizia l'ora legale!
Quindi, come lo risolvo?
Grazie,
Marco
« Ultima modifica: 15 Marzo 2018, 10:24:28 CET da capitancooker, Reason: Merged DoublePost »
Se sbaglio, correggetemi.

Offline berpao

  • Utente normale
  • ***
  • Post: 160
  • Respect: +20
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S2
  • Play Store ID:
    Paolo Bersan
Re:Differenza giorni tra date
« Risposta #1 il: 15 Marzo 2018, 13:53:34 CET »
+1
Ciao , il problema come hai detto tu è il passaggio dell'ora legale, ma perchè nella tua funzione "toCalendar()" imposti di default il tempo a 0 (ore, minuti, secondi e millisecondi), quindi tornando indietro di un'ora per l'ora legale ti cambia anche il giorno (la mezzanotte del 26  diventano le 23:00 del 25). Credo ti basti impostare l'ora alla 1 del mattino  o se vuoi essere sicuro a mezzogiorno, così anche con l'ora legale non ti cambia la data.
Ciao
P

PS
non so se potrebbe essere un problema, ma dovresti considerare anche il timezone per essere sicuro

Offline capitancooker

  • Utente junior
  • **
  • Post: 123
  • Marco
  • Respect: +10
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    macOS High Sierra
Re:Differenza giorni tra date
« Risposta #2 il: 15 Marzo 2018, 15:22:10 CET »
0
Ciao Paolo,
a dire il vero all'una non cambia perché il cambio all'ora legale avviene alle 3, e così funziona.
Peccato che non vada bene per l'uscita dall'ora legale, salta un giorno.
Alla fine ho adottato JodaTime come suggerito in questo post:
https://stackoverflow.com/questions/3802893/number-of-days-between-two-dates-in-joda-time
Grazie mille,
Marco
Se sbaglio, correggetemi.