2011-11-15 16 views
5

Sto usando l'oggetto Data JavaScript per convertire i millisecondi in una stringa leggibile minutes:seconds formattata. Ho bisogno di creare un timer per un video player personalizzato, in cui la mia interfaccia JS riceve le informazioni sulla durata del video come valore in millisecondi.getHours() restituisce un valore errato

È stato un compito abbastanza semplice, prima ho deciso di supportare la possibilità di avere un video più lungo di 59 minuti. E poi ho riscontrato questo problema: quando invio un valore al millisecondo al costruttore del nuovo oggetto Date, e quindi chiamo getHours(), restituirà qualcosa anche se il numero di millisecondi corrisponde a un periodo di tempo inferiore a un'ora. Il modo più semplice per vedere in azione è quello di alimentare è, per esempio, 0.

enter image description here

mi aspetto che ritorni 0, ma restituisce sempre 12 (13 in Opera, il che rende ancora più strano). È un comportamento normale o un bug? In entrambi i casi, come posso rilevare in modo affidabile se il mio valore in millisecondi è limitato a pochi minuti e secondi o include anche ore?

Grazie.

UPD:

ho provato in Chrome 15 e Firefox 7 su OSX: stesso risultato come da screenshot qui sopra. Non riesco a capire come usare la console di Opera Dragonfly, ma da quello che vedo succede lo stesso in Opera, solo con il valore di 13 per getHours().

+0

Non si desidera utilizzare qui il costruttore 'Date'. 'new Date (n)' restituisce un oggetto 'Date' con la data impostata al 1 ° gennaio 1970 +' n' millisecondi, che non è certamente quello che vuoi ... –

+0

@ ŠimeVidas, quindi quale sarebbe una buona alternativa? – Arnold

+0

Scriverò la mia funzione. –

risposta

7

Prova a chiamare new Date(0).toString() e vedi se c'è un fuso orario che lo influenza?

miniera dà

"Thu Jan 01 1970 02:00:00 GMT+0200 (FLE Standard Time)" 

Perché io sono in GMT + 2, quindi getHours dà 2 a me.

L'Unix epoca è GMT + 0

Usa +new Date per ottenere millisecondi affidabili in un punto nel tempo e tenerlo come numero. Non fare alcun calcolo matematico all'interno di un oggetto data reale.

Ecco quello che ho usato:

var toTimeString = function(secs) { 
var days, hours, minutes, seconds; 

    if(secs == null) 
    return ""; 

days = (secs/86400) >> 0; 
hours = (secs % 86400/3600) >> 0; 
minutes = (secs % 3600/60) >> 0; 
seconds = (secs % 60);  
seconds = seconds < 10 ? "0" + seconds : seconds; 
minutes = minutes < 10 ? "0" + minutes : minutes; 
hours = hours && hours < 10 ? "0" + hours : hours; 

return "" + (days ? days+" - " : "") + (hours ? hours+":" : "") + minutes + ":" + seconds;  
}; 

Applicare la formattazione personalizzata come richiesto .. Questo in realtà prende secondi in modo dividere millisecondi per 1000 per ottenere secondi.

+0

Giusto, fuso orario. Sono in Nuova Zelanda, ecco perché nel mio caso aggiunge 12 ore a 0. Non ci avrei mai pensato, grazie mille! Anche se non risolve il problema, mostra semplicemente quanto inaffidabile questo approccio sia in realtà ... – Arnold

0

provare a specificare il valore di anno, mese, giorno, ore, minuti, secondi e millesimi di secondo, invece:

var sampleTime = new Date(1900,1,1,0,0,0,0); 
+1

Questo sarebbe il 1 ° febbraio 1900. I mesi sono a base zero, ad esempio gennaio è mese '0'. – gilly3

+0

@ gilly3 Buon punto, l'ho dimenticato. Ad ogni modo, la data è alquanto arbitraria. È il momento che è importante in questo caso. – GregL

2

So che non stai chiedendo per questo, ed è fastidioso per ottenere le risposte che non lo fanno affronta la tua domanda, ma in questo caso ... consiglierei seriamente di passare a Datejs prima di lavorare molto girovagando con l'oggetto nativo Date() di JS che non è eccessivamente potente e può essere fonte di molti problemi, specialmente se devi normalizzare i fusi orari! http://www.datejs.com/

13

Ho notato che, mentre le persone informavano l'utente su come risolvere il suo codice, non lo informavano su come fare ciò che chiedeva. La risposta è molto semplice. Non utilizzare la funzione getHours(). Usa getUTCHours(). Questo ignorerà qualsiasi offset del fuso orario.

Avrai ancora problemi se hai bisogno di andare fino a giorni, ma, fino ad allora, la primitiva Data funzionerà bene per quello che lo usi.

+0

Grazie a ciò, GetUTCHours ha risolto il mio problema simile senza la necessità di altri trucchi. – fubeca

Problemi correlati