2013-09-22 14 views
5

Cosa c'è che non va? Suppongo che se sottraggo 1ms dal 1 gennaio 1980 0: 0: 0 allora ho 1979. Ma devo sottrarre circa 500+ ms per questo. Per favore, dammi un suggerimento.La sottrazione di 1 ms porta a comportamenti imprevisti

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.set(1980, 0, 1, 0, 0, 0) 
val date = new Date 
date.setTime(cal.getTimeInMillis()) // <- 1980 Jan 01 0:0:0 
date.setTime(cal.getTimeInMillis() - 1) // <- 1980 Jan 01 0:0:0 too !!! 

Aggiornato.

La soluzione è

val cal = Calendar.getInstance(TimeZone.getTimeZone("UTC")) 
cal.setTimeInMillis(0) 
cal.set(1980, 0, 1, 0, 0, 0) 
+0

Solo un'ipotesi, ma forse internamente Calendar arrotonda i secondi? – Aaron

+0

Provare a stampare il contenuto 'date' dopo la prima chiamata' setTime() '. Forse l'anno, il mese, il giorno, l'ora, il minuto e il secondo sono il valore che imposti, ma non i millisecondi. –

+0

È un po 'di confusione. Non voglio usare Yoda Time o un'altra libreria di terze parti. Devo convertire anno, mese, giorno in millisecondi e poi ottenere l'ultimo millesimo di secondo. Voglio trovare la soluzione corretta per questo. Sfortunatamente, javadoc tace su tale situazione. – Ezhik

risposta

5

Con Calendar.set(year, month, day, hourOfDay, minute, second) viene impostato alcun millisecondi. Di conseguenza, l'implementazione di Calendar imposta i millisecondi su "sconosciuto" che viene effettivamente considerato come il punto medio all'interno del secondo specificato.

Sottraendo 500 ms significa che si passa sopra il punto medio. Lo stesso dovrebbe accadere se aggiungete 500ms, il che dovrebbe portarvi a poco più di un secondo. Sottrarre effettivamente 500ms funziona e devi aggiungere 620ms per vedere il secondo successivo.

+0

E come ottenere correttamente l'ultimo millesimo di secondo del 1979? – Ezhik

+0

sottrarre 500ms non darà necessariamente l'ultimo millesimo di secondo del 1979. –

+0

@Ezhik, imposta in modo esplicito i millisecondi con 'calendar.set (Calendar.MILLISECOND, 0);'. Quando sottrai un millisecondo da ciò ottieni direttamente l'ultimo millisecondo nel 1979. – jboi

Problemi correlati