2011-02-02 12 views
6

Sto cercando di calcolare una differenza di tempo data, ma sto ottenendo alcuni risultati strani: Qui è la fonte:java differenza data di puzzle

import java.util.Calendar; 
    import java.util.Collections; 
    import java.util.Vector; 

    public class Main { 

     static Calendar dcal = Calendar.getInstance(); 
    static Calendar ccal = Calendar.getInstance(); 
    public static void main(String[] args) { 
     dcal.set(2011, 1, 27); 
     ccal.set(2011,2,1); 
     long dtime = dcal.getTimeInMillis(); 
     long ctime = ccal.getTimeInMillis(); 
     long diff = ctime - dtime; 
     int hours = (int) (diff/(1000 * 60 * 60)); 
     System.out.println("hours->"+hours); 

    } 

} 

Quando ho creato ccal al 1 31 2011, la differenza di data è 96 ore ma quando l'ho impostato su 2 1 2011 la differenza di data è 48 ore. Come può essere? Qual è il rimedio?

Grazie,

Elliott

risposta

6

Se stai impostando ccal in questo modo "ccal.set(2011, 1, 31)" la data è in realtà 3 Marzo 2001, dal momento che mesi sono pari a zero based e gli involtini di calendario per impostazione predefinita. Quindi la differenza di 48 ore (96-48) è corretta perché ci sono due giorni tra il 1 marzo (set(2011,2,1)) e il 3 marzo (set(2011,1,31)).

+0

Grazie per le informazioni sul calendario che si muovono di default. –

4

Tu sai che sono mesi 0 sulla base, giusto? Quindi 0 rappresenta gennaio e 1 rappresenta febbraio, quindi 1 31 2011 non esiste. In effetti è meglio non usare i numeri ma utilizzare le costanti del calendario per i mesi, ad esempio Calendar.JANUARY. Per vedere di persona cosa sta succedendo, stampare Data corrispondente del tuo calendario:

ccal.set(2011, 1, 31); 
    System.out.println(ccal.getTime()); 
+0

Lo so, ma non spiega il risultato – Elliott

+3

Penso che lo faccia. Dal momento che il 31 gennaio 2011 non esiste, accadono cose inaspettate. Di nuovo, stampa la data come ho menzionato nella modifica della mia risposta. –

+1

No, non inaspettato. Perfettamente ben documentato. – dty