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

4 minutos de lectura

avatar de usuario
pupeño

Quiero un solo número que represente la fecha y la hora actual, como un marca de tiempo de Unix.

  • var timeStampInMs = window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? ventana.rendimiento.ahora() + ventana.rendimiento.timing.navigationStart : Fecha.ahora(); console.log(timeStampInMs, Date.now());

    usuario16559547

    3 ago 2021 a las 15:30

avatar de usuario
xer0x

Me gusta este, porque es pequeño:

+new Date

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

Date.now()

  • @Billy Tal como lo recuerdo, calculé la marca de tiempo en las dos soluciones sugeridas 1 millón de veces cada una y calculé el tiempo de ejecución promedio. Lo ejecuté en Firefox y Chrome, y getTime fue más rápido en ambos navegadores. Dicho esto, incluso si fuera (ligeramente) más lento, elegiría new Date().getTime(). Afortunadamente para mí, ¡la solución más rápida ya es la solución legible!

    – en pocas palabras

    8 de julio de 2013 a las 12:44

  • De acuerdo con @FabrícioMatté. El comportamiento del operador unario puede no ser rudimentario, pero si no lo ha repasado, no espere poder funcionar de manera efectiva en muchos equipos.

    – Jason T. Featheringham

    18 de julio de 2013 a las 1:58

  • @Niklaus Eso es porque lo estás concatenando a otra cadena. En ese caso, new Date().toString() se llama.

    – Kirb

    2 oct 2013 a las 11:50

  • + es matemática unaria en este caso. typeof (+nueva Fecha()) se evalúa como “número”. Básicamente es una abreviatura de new Date().valueOf() — sin la llamada a la función javascript. Pero no lo escribas de esta manera, parece un error tipográfico.

    – ansiart

    20 de diciembre de 2014 a las 22:58

  • @FelixGagnon-Grenier Agregué Date.now() porque ahora es la forma preferida, y a mucha gente no le gusta +new Date. Me gusta que la respuesta de Daveb ahora incluya +new Datey lo explica, pero tampoco solía hacerlo.

    – xer0x

    4 de enero de 2017 a las 0:15

avatar de usuario
Staale

var time = Date.now || function() {
  return +new Date;
};

time();

Proporciono múltiples soluciones con descripciones en esta respuesta. Siéntase libre de hacer preguntas si algo no está claro


Solución rápida y sucia:

Date.now() /1000 |0

Advertencia: eso puede que romper en 2038 y devolver números negativos si haces lo |0 magia. Usar Math.floor() en cambio por ese tiempo

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 obtener Date.now() laboral:

Para que funcione en IE, puede 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 fechas posteriores a 2038:

Las operaciones bit a bit provocarán el uso de enteros de 32 bits en lugar de punto 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 primero, puede usar algo como esto:

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

En caso de que esté usando jQuery, podría usar $.now() como se describe en Documentos de jQuery lo que hace que el polyfill sea obsoleto ya que $.now() internamente hace lo mismo: (new Date).getTime()

Si está contento con la versión de jQuery, considere votar a favor este respuesta ya que no la encontré yo mismo.


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

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

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

Sin embargo, ten cuidado: convertirá un doble de 64 bits en un entero de 32 bits.
Esto dará como resultado la pérdida de información cuando se trate de grandes números.
Las marcas de tiempo se interrumpirán después de 2038 debido al desbordamiento de enteros de 32 bits, a menos que Javascript se mueva a enteros de 64 bits en modo estricto.


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

avatar de usuario
aemkei

var timestamp = Number(new Date()); // current time as number

¿Ha sido útil esta solución?