¿Cómo obtengo una marca de tiempo en JavaScript?
Quiero un número único que represente la fecha y hora actuales, como una marca de tiempo de Unix .
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 valueOf
directamente:
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 getTime
directamente:
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());
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()
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();
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
|0
magia. ÚseloMath.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 |0
hace:
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() / 1000
en 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.now
seguir este enlace: Date.now()
@ MDN
var time = Date.now || function() {
return +new Date;
};
time();