¿Cómo obtengo una marca de tiempo en JavaScript?

Resuelto Pablo Fernandez asked hace 15 años • 44 respuestas

Quiero un número único que represente la fecha y hora actuales, como una marca de tiempo de Unix .

Pablo Fernandez avatar Oct 21 '08 16:10 Pablo Fernandez
Aceptado

Marca de tiempo en milisegundos

Para obtener el número de milisegundos desde la época de Unix , llame a Date.now:

Date.now()

Alternativamente, use el operador unario +para llamar Date.prototype.valueOf:

+ new Date()

Alternativamente, llame valueOfdirectamente:

new Date().valueOf()

Para admitir IE8 y versiones anteriores (consulte la tabla de compatibilidad ), cree una corrección para Date.now:

if (!Date.now) {
    Date.now = function() { return new Date().getTime(); }
}

Alternativamente, llame getTimedirectamente:

new Date().getTime()

Marca de tiempo en segundos

Para obtener el número de segundos desde la época de Unix , es decir, la marca de tiempo de Unix :

Math.floor(Date.now() / 1000)

Alternativamente, usar bit a bit o to Floor es ligeramente más rápido, pero también menos legible y puede fallar en el futuro (consulte las explicaciones 1 , 2 ):

Date.now() / 1000 | 0

Marca de tiempo en milisegundos (mayor resolución)

Usar performance.now:

var isPerformanceSupported = (
    window.performance &&
    window.performance.now &&
    window.performance.timing &&
    window.performance.timing.navigationStart
);

var timeStampInMs = (
    isPerformanceSupported ?
    window.performance.now() +
    window.performance.timing.navigationStart :
    Date.now()
);

console.log(timeStampInMs, Date.now());
Expandir fragmento

daveb avatar Oct 21 '2008 09:10 daveb

Me gusta esto porque es pequeño:

+new Date

También me gusta esto porque es igual de corto y compatible con los navegadores modernos, y más de 500 personas votaron que es mejor:

Date.now()
xer0x avatar Feb 18 '2011 00:02 xer0x

JavaScript funciona con la cantidad de milisegundos desde la época, mientras que la mayoría de los otros lenguajes funcionan con segundos. Podrías trabajar con milisegundos, pero tan pronto como pases un valor que diga PHP, las funciones nativas de PHP probablemente fallarán. Así que para estar seguro siempre uso segundos, no milisegundos.

Esto le dará una marca de tiempo de Unix (en segundos):

var unix = Math.round(+new Date()/1000);

Esto le dará los milisegundos desde la época (no la marca de tiempo de Unix):

var milliseconds = new Date().getTime();
Daithí avatar May 11 '2011 22:05 Daithí

Proporciono múltiples soluciones con descripciones en esta respuesta. No dude en hacer preguntas si algo no está claro.


Solución rápida y sucia:

Date.now() /1000 |0

Advertencia : podría romperse en 2038 y arrojar números negativos si haces la |0magia. Úselo Math.floor()en su lugar para ese momento

Math.floor()solución:

Math.floor(Date.now() /1000);

Alguna alternativa nerd de Derek 朕會功夫tomada de los comentarios debajo de esta respuesta:

new Date/1e3|0

Polyfill para empezar a Date.now()trabajar:

Para que funcione en IE, puedes hacer esto (Polyfill de MDN ):

if (!Date.now) {
    Date.now = function now() {
        return new Date().getTime();
    };
}

Si no le importa el año/día de la semana/horario de verano, debe recordar esto para las fechas posteriores a 2038:

Las operaciones bit a bit provocarán el uso de enteros de 32 bits en lugar de coma flotante de 64 bits.

Deberá usarlo correctamente como:

Math.floor(Date.now() / 1000)

Si solo desea saber el tiempo relativo desde el momento en que se ejecutó el código por primera vez, puede usar algo como esto:

const relativeTime = (() => {
    const start = Date.now();
    return () => Date.now() - start;
})();

En caso de que esté utilizando jQuery, puede utilizarlo $.now()como se describe en los documentos de jQuery , lo que hace que el polyfill quede obsoleto ya que $.now()internamente hace lo mismo:(new Date).getTime()

Si simplemente está satisfecho con la versión de jQuery, considere votar a favor de esta respuesta, ya que yo no la encontré.


Ahora una pequeña explicación de lo que |0hace:

Al proporcionar |, le dice al intérprete que realice una operación binaria OR.
Las operaciones de bits requieren números absolutos, lo que convierte el resultado decimal Date.now() / 1000en un número entero.

Durante esa conversión, los decimales se eliminan, lo que da como resultado un resultado similar al que Math.floor()obtendría usando.

Sin embargo, tenga cuidado: convertirá un doble de 64 bits en un entero de 32 bits.
Esto resultará en una pérdida de información cuando se trata de números enormes.
Las marcas de tiempo se interrumpirán después de 2038 debido al desbordamiento de enteros de 32 bits a menos que Javascript pase a enteros de 64 bits en modo estricto.


Para más información sobre Date.nowseguir este enlace: Date.now()@ MDN

GottZ avatar Jul 12 '2012 07:07 GottZ
var time = Date.now || function() {
  return +new Date;
};

time();
Staale avatar Oct 21 '2008 10:10 Staale