2012-04-04 14 views
6

Ho affrontato lo stesso problema molte volte.JAVA - Si tratta di un bug nella classe java.util.Calendar o cosa?

Lo stesso problema è stato con questa domanda e Got soluzione come la stessa, How to compare known hours ad current hour in android?

Problema:

Quando uso Calendar calCurr = Calendar.getInstance(); per ottenere l'oggetto Calendario di data e ora correnti, E 'sempre tornare mi sbaglio.

Ho messo i log e l'ho controllato e per renderlo corretto ho dovuto aggiungere anni e mesi e poi ho ottenuto l'oggetto corretto per Data e ora correnti.

Vedi il mio esempio:

Calendar calCurr = Calendar.getInstance(); 
    Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); 
       // see what it gives? dont know why? 

    Date date = new Date(); 
    calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); 
       // so added one month to it 

    Log.i("Time in mili of Current - after update", ""+calCurr.getTimeInMillis()); 
       // now get correct 

Domanda:

  • Perché è dando l'uscita sbagliata?
  • Si tratta di un bug o il mio concetto sulla classe Calendar è errato?
  • dimmi cosa avrebbe dovuto fare per quello?
+0

Qual è il risultato che non va? –

+0

@CarlosHeuberger il link Domanda sopra riportato è lo stesso problema del mio .. – MKJParekh

+0

perché non fornisce entrambi i calendari uguali quando uno è oggetto corrente e un altro con valori impostati di data corrente e da db .. – MKJParekh

risposta

5

Funziona perfettamente come previsto se si passa ad getDate() emette:

Tempo in mili di Current - Normale mer 4 apr 11:34:34 BST 2012

Tempo in mili di Current - dopo l'aggiornamento ven 04 maggio 11:34:34 BST 2012

Cosa ti aspetti? E in milleseconds è uguale anche 30 giorni:

Tempo in mili di Current - Normale 1333535834557

Tempo in mili di Current - dopo l'aggiornamento 1336127834557

e il calcolo è (differenza, diviso da millisecondi in un giorno):

1336127834557 - 1333535834557 = 2 592 000 000 

2592000000/86400000 = 30 

E oggi la data in millisecondi dopo il 1970 è 1333536754 ... whic h si adatta, non vedo un problema.

EDIT

Il tuo problema è che si sta configurando come Mese 3 per marzo ... non è necessario impostare 2 ..perché i mesi sono indicizzati da 0 a 11.

+0

Funziona esattamente come ci si aspetterebbe – NimChimpsky

+0

Potresti non aver visto che ... i millisecondi corretti in base alla data e ora correnti sono il secondo ... non quello normale. – MKJParekh

+0

Cosa, no non lo è. Si esegue l'output di datetime corrente, quindi si cambia e si mette fuori. Ho appena eseguito il codice. Restituisce il numero di millisecondi dal 1 gennaio 1970, 00:00:00 GMT – NimChimpsky

0

È la strana implementazione di Calendar. Per alcuni motivi, gennaio è il mese 0 e anche gli anni non sono molto logici.

Raccomando la libreria di tempo Joda.

+0

Grazie..Voglio sapere..perché il Calendario non restituisce ciò che dovrebbe essere restituito. – MKJParekh

+0

Il calendario restituisce esattamente ciò che dovrebbe restituire dati i suoi dati di input. Stai alimentando dati errati. Date.getMonth() sarà _NOT_ ti darà il mese equivalente in un oggetto Calendar. – mcfinnigan

5

Non utilizzare date.getXXX(). Non utilizzare alcun setter o getter ad eccezione di Date.getTime(). Sono tutti deprecati. Usarli potrebbe causare risultati inaspettati.

Se si chiama Calendar.getInstance(), è già impostato sulla data corrente. Se si desidera impostare o aggiungere giorni, mesi, qualunque cosa, impostarli sul calendario.

E.g. calCurr.set(Calendar.MONTH,2) o calCurr.add(Calendar.DAY,1).

+0

per favore basta vedere .. ho usato solo getTimeInMillis() quando non mi ha dato corretto ho appena provato a trovare corretto. – MKJParekh

+0

Hai usato 'calCurr.set (Date.getYear() + 1900, Date.getMonth() + 1, Date.getDate(), Date.getHours(), date.getMinutes(), date.getSeconds());' che è il modo sbagliato. – Stephan

1

I mesi di calendario sono indicizzati a zero. Quindi, quando si desidera impostare per marzo 2 non è

Inoltre, non impostare l'anno, il mese e la data dall'oggetto Data. Se si deve inizializzare un calendario per una data, fare in questo modo:

Calendar cal = Calendar.getInstance(); 
    cal.setTime(date); 

essere consapevoli che il vostro oggetto Date potrebbe essere un locale diverso da quello che si pensa che è.

+0

Voglio sapere getTimeInMillis() e il suo output. – MKJParekh

+0

Questo è il vero cattura ... È bene ... Grazie così much.I desidera accettare questa risposta troppo .. – MKJParekh

0

Stiamo utilizzando le righe di codice riportate di seguito per trovare la data e l'ora correnti. Sta funzionando bene dalla nostra parte.

  java.util.Calendar calc = java.util.Calendar.getInstance(); 

     int day = calc.get(java.util.Calendar.DATE); 
     int month = calc.get(java.util.Calendar.MONTH)+1; 
     int year = calc.get(java.util.Calendar.YEAR); 

     String dayStr,monthStr; 
     if(day<10){ 
      dayStr = "0"+day; 
     }else{ 
      dayStr = ""+day; 
     } 
     if(month<10){ 
      monthStr = "0"+month; 
     }else{ 
      monthStr = ""+month; 
     } 
     /*String currentdate = monthStr+"/"+dayStr+"/"+year+" ";*/ 
     String currentdate = dayStr+"/"+monthStr+"/"+year+" "; 

     /*String currenttime = currentdate + String.valueOf(calc.get(java.util.Calendar.HOUR_OF_DAY))+ ":"+ 
     String.valueOf(calc.get(java.util.Calendar.MINUTE))+":"+String.valueOf(calc.get(java.util.Calendar.SECOND));*/ 

     return currentdate; 
+0

Mayur grazie per l'code..I non desiderano codes..I vuole spiegazioni ... Perché in un primo momento time calCurr.getTimeInMillis() restituisce l'errore. – MKJParekh

+0

@Frankenstein: come sei arrivato a quel risultato? –

1

L'API basata su data Java non è progettata correttamente. nelle versioni future penso che alcuni problemi dell'API siano pianificati per affrontare.

Si consiglia di utilizzare JodaTime.

+0

La data è già stata Deposto..so Usando Calendario .. – MKJParekh

+0

Intendo l'API basata su data –

+0

Anche il calendario ha funzionato perfettamente ... Grazie .. – MKJParekh

0

Quando l'oggetto Calendario viene creato utilizzando Calendar.getInstance(), la variabile di istanza "time" nell'oggetto Calendar viene impostata e questo valore verrà modificato solo se si utilizza la funzione Calendar.setTimeInMillis().
snippet di codice oggetto Calendario:

public long getTimeInMillis() { 
     if (!isTimeSet) { 
     updateTime(); 
    } 
     return time; 
    } 

Qui "isTimeSet" diventerà "vera", quando viene chiamato Calendar.getInstance() e restituisce "tempo" ogni volta senza aggiornare il tempo.

Questo è il motivo per cui si ottiene lo stesso valore di tempo ogni volta che si chiama calCurr.getTimeInMillis();

Spero che questo aiuti.

1

NON è un bug, il Calendario sta restituendo quello che dovrebbe (almeno qui è).

Calendar calCurr = Calendar.getInstance(); 
Log.i("Time in mili of Current - Normal", ""+calCurr.getTimeInMillis()); 
      // see what it gives? dont know why? 

Ho ottenuto 1333546375707 millisecondi, che è il valore corretto (calcolato anche a mano).
Quale valore ti aspetti qui? Come sai che è sbagliato?


Date date = new Date(); 
calCurr.set(date.getYear()+1900, date.getMonth()+1, date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds()); 
      // so added one month to it 

Perché l'aggiunta di uno al mese? Il mese di Data e Calendario sono a base zero: non è necessario aggiungere 1.


EDIT
Calcolo a mano (approssimata):

2012 - 42 years * 365.24 days/year * 86400 seconds/day 
April - (31 + 29 + 31) days * 86400 
4th - 3 days * 86400 
13:30 - 13.5 hours * 3600 seconds/hour 
     ==================== 
     1333553112 seconds 
+0

Grazie mille. – MKJParekh

Problemi correlati