2012-06-08 49 views
15

¿Cuál es la mejor forma de calcular el tiempo transcurrido desde la (última) medianoche en ms?Cómo calcular ms desde la medianoche en Javascript

+0

[Fecha] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) Obtener un objeto de fecha para (último) la medianoche y restar "ahora" de él ... - Simplemente matemáticas simples – Andreas

+0

@Areas Medianoche restado de ahora da un tiempo negativo;) –

+0

¡Gracias muchachos! Kolnik, tu solución también da un tiempo negativo? – Olga

Respuesta

25

Cree una nueva fecha utilizando el día/mes/año actual, y obtenga la diferencia.

var now = new Date(), 
    then = new Date(
     now.getFullYear(), 
     now.getMonth(), 
     now.getDate(), 
     0,0,0), 
    diff = now.getTime() - then.getTime(); // difference in milliseconds 
+2

Puede hacer eso mucho más fácil al copiar el objeto de fecha y establecer la hora en 00:00:00. Su respuesta puede ser incorrecta si el reloj marca entre crear las dos fechas. – RobG

+0

Funciona mal en los casos '2/365 * 100%' debido al cambio de horario de verano – Dan

+1

@Dan: no, el objeto Date usa marcas de tiempo que son indiferentes a DST. Agregue el hecho de que el horario de verano cambia en algún momento temprano de la mañana, pero no a la medianoche, está bien –

0
var today = new Date(); 
var d = new Date(today.getFullYear(), today.getMonth(), today.getDate(), 0, 0, 0, 0); 

var difference = today.getTime() - d.getTime(); 
0

segundos desde la medianoche serían simplemente para mostrar la hora, pero en lugar de utilizar horas: minutos: segundos, todo se convierte en cuestión de segundos.

creo que esto debería hacerlo:

var now = new Date();  
var hours = now.getHours()*(60*60); 
var minutes = now.getMinutes()*60; 
var seconds = now.getSeconds(); 

var secSinceMidnight = hours+minutes+seconds; 
+1

esto está mal en el horario de verano – Mala

+0

@Mala ¿quiere decir que este código falla si la corrección de ahorro de luz diurna se aplicó la última medianoche? Entonces la respuesta de Andrew D. también falla – Dan

+0

@Dan: esta respuesta supone que 8am significa 8 horas desde la medianoche, lo que no ocurre en los días en que comienza o termina el horario de verano. No he examinado detenidamente la respuesta de Andrew, pero en cualquier caso recomiendo la respuesta de RobG anterior, porque puedo confirmar que funciona, y no se ve afectada por un posible tic del reloj entre las dos declaraciones de fecha – Mala

1
var d=new Date(); 
// offset from midnight in Greenwich timezone 
var msFromMidnightInGMT=d%86400000; 
// offset from midnight in locale timezone 
var msFromMidnightLocale=(d.getTime()-d.getTimezoneOffset()*60000)%86400000; 
24

Un montón de respuestas hasta aquí otra:

var d = new Date(), e = new Date(d); 
var msSinceMidnight = e - d.setHours(0,0,0,0); 

En función:

function getMsSinceMidnight(d) { 
    var e = new Date(d); 
    return d - e.setHours(0,0,0,0); 
} 

alert(getMsSinceMidnight(new Date())); 
+1

Esta es buena. Maneja correctamente el horario de verano. – Mala

3

simple de escribir , si no te importa crear dos fechas.

var msSinceMidnight= new Date()-new Date().setHours(0,0,0,0); 
10

Muchas respuestas excepto RobG's (recommended answer), Kolink's y Lai's son mal aquí

Veamos más de cerca juntos


Primer error

OptimusCrime y Andrew D. respuestas:

Como Mala sugested, si la corrección de ahorro de luz diurna se aplicó a la medianoche más cercana, obtenemos un valor incorrecto. Vamos depuración:

  1. Supongamos que es último domingo de marzo
  2. El tiempo se ha fijado a las 2 am.
  3. Si vemos las 10 horas del reloj, de hecho hay 11 horas pasaron desde la medianoche
  4. Pero en lugar Contamos 10 * 60 * 60 * 1000 ms
  5. El truco se juega cuando la medianoche ocurre en diferente estado de horario de verano vigente en ese momento

segundo error

kennebeck's respuesta:

Como escribió RobG, el reloj puede marcar si obtiene la hora del sistema dos veces. Incluso podemos aparecer en diferentes fechas a veces.Puede reproducir este en un bucle:

for (var i = 0; true; i++) { 
    if ((new Date()).getTime() - (new Date()).getTime()) { 
     alert(i); // console.log(i); // for me it's about a 1000 
     break; 
    } 
} 

Tercer es mi trampa personal que posiblemente podría experimentar

Considere el siguiente código:

var d = new Date(), 
    msSinceMidnight = d - d.setHours(0,0,0,0); 

msSinceMidnight es siempre 0 como el objeto se cambia durante el cálculo antes de la operación de resta


Por fin, este código funciona:

var d = new Date(), 
    msSinceMidnight = d.getTime() - d.setHours(0,0,0,0); 
Cuestiones relacionadas