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

    Problema con la Data e long

    Ciao sto provando a stampare la data esatta di un tempo definito in long (in questo caso sono 21 giorni cioè 1814400000).

    codice:
    	public static void main(String[] args) {
    		
    		long time = 1814400000; //21 giorni
    		System.out.println(getDateFormat(time));
    		
    	}
    	
    	private static String getDateFormat(long time) {
    
    
    		String pattern = "";
    
    
    		//Per i giorni
    		if ((time / (24 * 60 * 60 * 1000)) != 0) {
    			pattern += "dd 'Giorni' ";
    		}
    		//Per le ore
    		if ((time / (60 * 60 * 1000)) != 0) {
    			pattern += "HH 'Ore' ";
    		}
    		//Per i minuti
    		if ((time / (60 * 1000)) != 0) {
    			pattern += "mm 'Minuti' ";
    		}
    		//Per i secondi
    		if ((time / (1000)) != 0) {
    			pattern += "ss 'Secondi' ";
    		}
    
    
    		DateFormat dateFormat = new SimpleDateFormat(pattern);
    		return dateFormat.format(new Date(time));
    
    
    	}
    Quando vado ad eseguire il programma invece di stamparmi 21 Giorni 00 Ore 00 Minuti 00 Secondi mi stampa 22 Giorni 01 Ore 00 Minuti 00 Secondi


    ​Sapete dirmi il perché? grazie

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gamerover98 Visualizza il messaggio
    Quando vado ad eseguire il programma invece di stamparmi 21 Giorni 00 Ore 00 Minuti 00 Secondi mi stampa 22 Giorni 01 Ore 00 Minuti 00 Secondi


    ​Sapete dirmi il perché? grazie
    Innanzitutto usare il long dei millisecondi con Date/DateFormat per rappresentare una "durata" non va granché bene, perché in realtà 1814400000 rappresenta l'istante del 22 Gennaio 1970 ore 00:00:00 in UTC.

    E poi c'è il fatto che i DateFormat per default usano il TimeZone corrente, quindi ti stampa l'ora "locale" (ecco il perché del +1 ora). Se anche mettessi prima di formattare:

    dateFormat.setTimeZone(TimeZone.getTimeZone("UTC") );

    in ogni caso ti stampa "22 Giorni" perché ti ripeto che NON lo tratta come una durata ma come una data. Ovvero sono passati 21 giorni esatti dal 1 Gennaio 1970 e quindi sei al 22 Gennaio 1970 00:00:00 esatte (sempre visto in UTC).
    Ultima modifica di andbin; 01-05-2016 a 14:23
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Cosa dovrei fare per risolvere il mio problema?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gamerover98 Visualizza il messaggio
    Cosa dovrei fare per risolvere il mio problema?
    A livello basilare .... basta che usi proprio quei calcoli (divisioni ecc) che hai fatto. Se quel campo della durata non è zero, componi la stringa già con quel valore. Tutto qui.

    Se poi vuoi, ci sono sicuramente librerie esterne specifiche. La ben nota Joda-Time mi pare che consenta la formattazione di una Duration (non ne sono sicuro al 100% ma potrei verificare).


    P.S. tra l'altro i calcoli che hai fatto sarebbero da rivedere un attimo. Nel senso: se vuoi che se l'ora è 0 non la stampi, devi cambiare il calcolo.
    Ultima modifica di andbin; 01-05-2016 a 16:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Grazie, guarderò un po grazie

  6. #6
    Ciao, ho trovato la soluzione al mio problema! Era semplicissimo, in pratica ho calcolato il tempo in long con il metodo getDateFormat() e sommandolo con il tempo attuale mi sono ricavato la data (in questo caso tra 21 giorni) in long.

    codice:
    	public static void main(String[] args) {
    		
    		int[] times = new int[]{21,0,0,0}; // Giorni, Ore, Minuti, Secondi
    		
    		//Calcolo del tempo
    		long time = getDateFormat(times);
    		long nowTime = System.currentTimeMillis();
    		long expiryTime = time + nowTime; //Somma del tempo ricavato con il tempo attuale
    		
    		System.out.println(time); //Stampa 1814400000
    		System.out.println(nowTime); //Stampa 1462197016777
    		System.out.println(expiryTime);//Stampa 1464011416777 cioè la somma tra i due		
    		
    	}
    	
    	private static long getDateFormat(int[] times) {
    
    
    		int n = 0;
    		long time = (long)(times[n++] * (24 * 60 * 60 * 1000)); //Calcolo per i giorni
    		time += (long)(times[n++] * (60 * 60 * 1000)); //* per le ore
    		time += (long)(times[n++] * (60 * 1000));//* per i minuti
    		time += (long)(times[n++] * (1000));//* per i secondi
    		
    		return time;
    		
    	}

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da gamerover98 Visualizza il messaggio
    Ciao, ho trovato la soluzione al mio problema! Era semplicissimo, in pratica ho calcolato il tempo in long con il metodo getDateFormat() e sommandolo con il tempo attuale mi sono ricavato la data (in questo caso tra 21 giorni) in long.
    Scusa ma ... questa è tutta un'altra cosa! Prima partivi da un long con dei millisecondi e volevi arrivare ad avere una stringa con la durata formattata ... ora parti con giorni/ore/ecc... spezzati, ricavi i millisecondi e li aggiungi ad un istante attuale.

    E quindi? Quale era il dubbio iniziale?? Come sommare giorni/ore/ecc... ad un certo istante nel tempo? Allora dovevi dirlo prima! Se cambi le carte in tavola, non è che ti si può aiutare più di tanto ...

    Tra l'altro l'implementazione è un po' "rozza". Nel senso che se vuoi sommare giorni/ore/ecc.. ad un istante ci sono modi migliori, ad esempio tramite la API del Calendar.
    Ultima modifica di andbin; 02-05-2016 a 18:59
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Scusami ma mi ero confuso con una domanda posta su un altro forum... e li ho risposto con la risposta che dovevo dare qui
    Il problema qui non l'ho ancora risolto o almeno ci ho provato senza risultati.

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.