Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    [JAVA] Differenza tra date

    Ciao a tutti, ho la necessità di calcolare la differenza temporale tra due date, ho scritto il seguente codice java:
    codice:
    import java.util.GregorianCalendar;
    
    
    public class Calendario {
    public static void main(String[] args){
    	//Calcola la differenza tra due date:
    	GregorianCalendar gcPrimo = new GregorianCalendar(2009,3,1,8,30,0);
    	GregorianCalendar gcSecondo = new GregorianCalendar(2009,3,1,10,0,0);
    	Long differenza = gcSecondo.getTimeInMillis() - gcPrimo.getTimeInMillis();
    	//DIFFERENZA = 5400000
    	GregorianCalendar gcDifferenza = new GregorianCalendar();
    	gcDifferenza.setTimeInMillis(differenza);
    
    	System.out.println(gcDifferenza.getTime());
    	//STAMPA : Thu Jan 01 02:30:00 CET 1970
    
    }
    }
    Qualcuno saprebbe spiegarmi perchè la differenza che stampa gcDifferenza è di 2 ore e 30 minuti quando in realtà è di 1 ora e 30 minuti?
    Grazie ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Differenza tra date

    Originariamente inviato da marasma1
    Qualcuno saprebbe spiegarmi perchè la differenza che stampa gcDifferenza è di 2 ore e 30 minuti quando in realtà è di 1 ora e 30 minuti?
    I millisecondi che passi al calendar sono interpretati secondo il tempo UTC (millisecondi a partire dalla 'epoch' cioè il solito 1 Gennaio 1970 ore 0:00:00). E poi fai stampare la data ottenuta dal toString() di Date che invece stampa la data (il formato è fisso) tenendo conto del timezone (e eventualmente del daylight saving time).

    Se hai i millisecondi ottenuti da una differenza non passarli ad alcuna classe Date o Calendar che sia. Usa banali operazioni di divisione ( / ) e modulo ( % ) per calcolarti secondi, minuti, ecc....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Innanzitutto grazie per la risposta.Ho modificato il mio script cosi:

    codice:
    public class Calendario {
    public static void main(String[] args){
    	//Calcola la differenza tra due date:
    	GregorianCalendar gcPrimo = new GregorianCalendar(2009,3,1,8,30,0);
    	GregorianCalendar gcSecondo = new GregorianCalendar(2009,3,1,10,0,0);
    	long differenza = gcSecondo.getTimeInMillis() - gcPrimo.getTimeInMillis();
    	//DIFFERENZA = 5400000
    	int ore = (int)(differenza/3600000); //60*60*1000
    	int oreInMill = ore * 3600000;
    	differenza = differenza - oreInMill;
    	int min = (int)(differenza/60000);
    	int minutiInMill = min * 60000;
    	differenza = differenza - minutiInMill;
    	int sec = (int)(differenza/60);
    
    	System.out.println(ore + ":" + min + ":" + sec);
    	//STAMPA : 1:30:0
    
    }
    }
    Penso che funzioni, però pensavo che esistesse un metodo piu comodo, non si potrebbe impostare a monte il TimeZone di tutti i GregorianCalendar e poi far stampare la data dal toString?.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da marasma1
    Innanzitutto grazie per la risposta.Ho modificato il mio script cosi:
    int ore = (int)(differenza/3600000); //60*60*1000
    int oreInMill = ore * 3600000;
    differenza = differenza - oreInMill;
    int min = (int)(differenza/60000);
    int minutiInMill = min * 60000;
    differenza = differenza - minutiInMill;
    int sec = (int)(differenza/60);
    Troppo complicato. L'ho detto, basta usare divisione e modulo (che non hai usato) ma sopratutto usarli bene.

    codice:
    int secondi = (int) (differenza / 1000 % 60);
    int minuti = (int) (differenza / 60000 % 60);
    int ore = (int) (differenza / 3600000);
    Che tra l'altro è pure semplice, pulito e comprensibile.

    Originariamente inviato da marasma1
    non si potrebbe impostare a monte il TimeZone di tutti i GregorianCalendar e poi far stampare la data dal toString?.
    Sì certo, usando un DateFormat o SimpleDateFormat e impostandogli il timezone UTC.
    Ma il risultato avrebbe "senso" solo se la differenza non supera 1 mese. In pratica stamperesti quello che è il tempo nel mese del Gennaio 1970 ... dopodiché, superato, non avrebbe più senso.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.