2011-11-15 39 views
5

Estoy usando el objeto JavaScript Date para convertir milisegundos en una cadena con formato minutes:seconds legible. Lo necesito para crear un temporizador para un reproductor de video personalizado, donde mi interfaz JS recibe la información de duración del video como un valor de milisegundos.getHours() devuelve el valor incorrecto

Ha sido una tarea bastante trivial, antes de que decidiera admitir la posibilidad de tener un video de más de 59 minutos. Y luego me encontré con este problema: cuando presento un valor de milisegundos para el nuevo constructor del objeto Fecha, y luego llamo al getHours(), devolverá algo incluso si la cantidad de milisegundos representa un período de menos de una hora. La forma más fácil de ver esto en acción es darle de comer, por ejemplo, 0.

enter image description here

yo esperaría que vuelva 0, pero siempre devuelve 12 (13 en la ópera, lo que hace aún más extraño). ¿Es esto un comportamiento normal o es un error? De cualquier manera, ¿cómo puedo detectar de manera confiable si mi valor en milisegundos está limitado a solo minutos y segundos o también incluye horas?

Gracias.

UPD:

Lo he probado en Chrome 15 y Firefox 7 en OSX: mismo resultado que por la captura de pantalla anterior. No puedo entender cómo usar la consola Opera Dragonfly, pero por lo que veo, sucede lo mismo en Opera, solo con el valor de 13 para getHours().

+0

No desea utilizar el constructor 'Date' aquí. 'new Date (n)' devuelve un objeto 'Date' con la fecha establecida en 1 de enero de 1970 +' n' milisegundos, que ciertamente no es lo que quiere ... –

+0

@ ŠimeVidas, entonces ¿cuál sería una buena alternativa? – Arnold

+0

Escribiría mi propia función. –

Respuesta

7

Intente llamar al new Date(0).toString() y vea si hay una zona horaria que lo afecte?

Mina da

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

porque estoy en GMT + 2, por lo getHours da 2 a mí.

el Epoch Unix es GMT + 0

Uso +new Date para obtener milisegundos fiables en un punto en el tiempo y mantenerlo como número. No hagas ninguna matemática dentro de un objeto de fecha real.

Aquí es lo que he utilizado:

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;  
}; 

Aplicar formato personalizado según sea necesario .. En realidad, esto toma unos segundos por lo dividen milisegundos por 1000 para obtener segundos.

+0

Derecha, zona horaria. Estoy en Nueva Zelanda, así que es por eso que en mi caso agrega 12 horas a 0. ¡Nunca hubiera pensado en eso, muchas gracias! Aunque no soluciona el problema, simplemente muestra cuán poco confiable es realmente este enfoque ... – Arnold

0

intente especificar el valor del año, mes, día, horas, minutos, segundos y milisegundos en su lugar:

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

Eso sería el 1 de febrero de 1900. Los meses están basados ​​en cero, por ejemplo, enero es el mes '0'. – gilly3

+0

@ gilly3 Buen punto, lo olvidé. En cualquier caso, la fecha es algo arbitraria. Es el momento que es importante en este caso. – GregL

2

Sé que no está pidiendo esto, y es molesto para obtener respuestas que no lo hacen dirija su pregunta, pero en este caso ... recomendaría seriamente cambiar a Datejs antes de que trabaje mucho anotando con el objeto Date() nativo de JS, que no es demasiado poderoso y puede ser una fuente de muchos problemas, especialmente si ¡tienes que normalizar las zonas horarias! http://www.datejs.com/

13

Noté que, aunque la gente le informaba al usuario sobre cómo arreglar su código, no le informaban cómo hacer lo que le pedía. La respuesta es bastante simple. No use la función getHours(). Use getUTCHours(). Esto omitirá cualquier desplazamiento de zona horaria.

Todavía tendrá problemas si alguna vez necesita subir hasta días, pero, hasta entonces, la primitiva de fecha funcionará perfectamente para lo que la usa.

+0

Gracias por esto, GetUTCHours solucionó mi problema similar sin la necesidad de ningún otro truco. – fubeca

Cuestiones relacionadas