2013-03-01 24 views
6

Ho fatto quanto segue:java.util.Date get millisecondi

String standardRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss"); 
Date range = rangeFormatter.parse(standardRange); 

Ora:

range.getTime(); 

.. ho l'uscita di -3.539.000 e non 61.000

I' Non sono sicuro di cosa sto facendo male; quando si esegue il debug, esiste cdate, l'attributo contiene fraction, che contiene il valore 61.000, che è ciò che voglio.

+0

Questo sito è solo in inglese, temo. Per favore fai del tuo meglio per metterlo in inglese, ci sono sempre persone in giro per aiutarti a chiarire se necessario – HXCaine

+0

Diese ist Englisch Website, kein Deutsch – PermGenError

+0

Puoi scrivere in inglese per favore? –

risposta

3

Il motivo che stai vedendo questo è che la data si sta creando è in realtà in passato la data epoca, non 1m1s dopo:

String standartRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("hh:mm:ss"); 
Date range = rangeFormatter.parse(standartRange); 

System.out.println(new Date(0L)); 
System.out.println(new Date(0L).getTime()); 
System.out.println(range); 
System.out.println(range.getTime()); 

e la sua uscita;

Thu Jan 01 01:00:00 GMT 1970 
0 
Thu Jan 01 00:01:01 GMT 1970 
-3539000 

La data epoca non è corretto qui - dovrebbe essere 00:00:00, ma a causa di un historical bug dove BST/GMT cambiato date e fuso orario non mi posso tenere traccia. Sembra che Sun/Oracle considerino questa "inaccuratezza" storica.

Controllare la segnalazione di errore: descrive il problema in modo più completo.

Dalla tua lingua (tedesco) questo potrebbe non essere dovuto direttamente a questo problema di BST, ma è quasi certamente correlato.

+0

quello che vuole è la differenza di fuso orario. quello che sta facendo è calcolare la data. Il problema non è in realtà un bug –

+0

@AdelBoutros beh non sono d'accordo - ho pensato che fosse dietro un motivo per il comportamento che stava vedendo, non come farlo. Dalle risposte qui può scegliere –

0

Per ottenere ciò che si desidera, è necessario confrontare tra il tempo che si desidera e l'origine del tempo. usando il codice seguente:

String standardRange = "00:01:01"; 
SimpleDateFormat rangeFormatter = new SimpleDateFormat("HH:mm:ss"); 
Date range = rangeFormatter.parse(standardRange); 
Date range2 = rangeFormatter.parse("00:00:00"); 
System.out.println(range.getTime() - range2.getTime()); 
+0

Huh? Il numero di millisecondi in un'ora e un minuto e un secondo non è 61000 ... – RudolphEst

+0

@RudolphEst controlla la mia modifica –

+0

Mi piace! Sembra che l'OP calcoli la differenza di orario, quindi è assolutamente il modo più corretto per farlo (se non vuoi essere bloccato a calcolare i tempi da solo). – RudolphEst

0

Secondo il JavaDoc, getTime():

Restituisce il numero di millisecondi a partire dal 1 gennaio 1970, 00:00:00 GMT rappresentato da questo oggetto Date.

Si desidera il numero di millisecondi in un minuto e un secondo.

(60*minutes+seconds)*1000 

E 'davvero non ha bisogno di venire da un oggetto Date.

Se è necessario calcolare il tempo in millisecondi per un certo intervallo, utilizzare la libreria joda time oppure recuperare il giorno, l'ora, i minuti, i secondi e i millisecondi dall'oggetto e calcolare il valore manualmente.

0

Prova:

Date range1 = rangeFormatter.parse("00:01:01"); 
Date range2 = rangeFormatter.parse("00:00:00"); 
System.out.println(range1.getTime() - range2.getTime()); 
1

Data Java non è stato progettato per calcolare la durata di un dato periodo di tempo. La chiamata getTime() restituisce i numeri di millisecondi dal 1 gennaio 1970, 00:00:00 GMT. Nel tuo caso, stai per finire con una data che precede quell'epoca (quindi il numero negativo). Quando eseguo il tuo codice ottengo 21661000. (Vedi la risposta dal Sean Landsman come credo abbia colpito sul perché ottieni i risultati negativi ...suggerimento: il mio numero è esattamente 6 ore off di GMT o 21600000ms)

Joda-Time è una libreria che si adatta perfettamente alla risoluzione del problema sottostante.

PeriodFormatter formatter = new PeriodFormatterBuilder() 
     .appendHours() 
     .appendSeparator(":") 
     .appendMinutes() 
     .appendSeparator(":") 
     .appendSeconds() 
     .toFormatter(); 
Period period = formatter.parsePeriod("00:01:01"); 
assert period.toStandardDuration().getMillis() == 61000 
+0

FYI, Joda-Time offre un trio di classi per rappresentare un intervallo di tempo: Durata, Intervallo e Periodo. –

0

hh:mm:ss sta per 12 ore, che si distingue sempre per "punto di tempo", non "intervallo di tempo". Quindi, sicuramente, il fuso orario influirà sul valore. Tuttavia, in GMT +0 il valore è uguale a quello che rappresenta "l'intervallo di tempo".

Tutto ciò che serve è solo:

rangeFormatter.setTimeZone(TimeZone.getTimeZone("GMT")); 

Provalo!