Node.js – ¿Cómo generar el formato de época de Unix de marca de tiempo?

5 minutos de lectura

avatar de usuario
usuario3846091

Estoy tratando de enviar datos al proceso de caché de carbón de grafito en el puerto 2003 usando

Terminal Ubuntu:

echo "test.average 4 `date +%s`" | nc -q0 127.0.0.1 2003

Nodo.js:

var socket = net.createConnection(2003, "127.0.0.1", function() {
    socket.write("test.average "+assigned_tot+"\n");
    socket.end();
});

Funciona bien cuando envío datos usando el comando de la ventana del terminal en mi ubuntu. Sin embargo, no estoy seguro de cómo enviar el formato de época de Unix de marca de tiempo desde nodejs.

Grpahite entiende la métrica en este formato metric_path value timestamp

¡Gracias!

  • +nueva Fecha() == la fecha de Unix

    – dandavis

    11 de agosto de 2014 a las 19:04

  • @dandavis En realidad, esa es solo la fecha. tienes que llamar getTime() para obtener milisegundos.

    – tadman

    11 de agosto de 2014 a las 19:08

  • @tadman: no, el “+” convierte la fecha en su valor valueOf(), que es un número que representa el número de ms desde que comenzó 1970. en resumen, nunca necesitas getTime()

    – dandavis

    11/08/2014 a las 19:10


  • Esa es una optimización interesante. Ese valor sigue siendo milisegundos, por lo que deberá dividir por 1000 para obtener segundos.

    – tadman

    11 de agosto de 2014 a las 19:13


avatar de usuario
tadman

El JavaScript nativo Date el sistema funciona en milisegundos en lugar de segundos, pero por lo demás, es el mismo “tiempo de época” que en UNIX.

Puede redondear hacia abajo las fracciones de segundo y obtener la época de UNIX haciendo:

Math.floor(+new Date() / 1000)

Actualizar: Como señala Guillermo, una sintaxis alternativa puede ser más legible:

Math.floor(new Date().getTime() / 1000)

los + en el primer ejemplo hay una peculiaridad de JavaScript que fuerza la evaluación como un número, que tiene el mismo efecto de convertir a milisegundos. La segunda versión hace esto explícitamente.

  • igual que ~~ (nueva fecha/1000) o Math.floor (nueva fecha/1000)

    – dandavis

    11 de agosto de 2014 a las 19:11


  • @dandavis Editado en consecuencia. Gracias por la nota allí. he usado floor aquí para estar seguro de que es un valor entero porque tradicional time_t los tiempos no tienen decimales.

    – tadman

    11 de agosto de 2014 a las 19:14


  • un momento de ajá es darse cuenta de que las Fechas son solo algunos métodos para humanos agregados a un Número…

    – dandavis

    11 de agosto de 2014 a las 19:18

  • Typescript se quejará de esto ya que la fecha es de otro tipo que el número también para Date.parse(new Date()) / 1000, etc., considere: Math.floor(new Date().getTime() / 1000) OR Math.floor (+nueva fecha() / 1000)

    – agua de edel

    1 de septiembre de 2020 a las 17:04

  • Voto a favor de esta respuesta porque es útil, pero debo decir que prefiero la nueva fecha más fácil de leer().getTime() sobre la +nuevafecha()

    – Guillermo F. ​​López

    12 oct 2020 a las 23:17


Si puedes, te recomiendo usar moment.js. Para obtener el número de milisegundos desde la época de UNIX, haga

moment().valueOf()

Para obtener el número de segundos desde la época de UNIX, haga

moment().unix()

También puedes convertir tiempos así:

moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()

Hago eso todo el tiempo.

Instalar moment.js en nodo,

npm install moment

y para usarlo

var moment = require('moment');
moment().valueOf();

árbitro

  • ¿Hay alguna ventaja particular en el uso de moment.js sobre algo como Math.floor(new Date() / 1000)?

    – Alex

    29 de octubre de 2015 a las 1:11

  • @Alex – Para mí, prefiero moment.jsLa sintaxis concisa y la funcionalidad más completa de . Puedes hacer cosas como moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').add(3, 'days')

    – Completa pila

    30 de octubre de 2015 a las 2:41

Métodos auxiliares que lo simplifican, copie/pegue lo siguiente en la parte superior de su JS:

Date.prototype.toUnixTime = function() { return this.getTime()/1000|0 };
Date.time = function() { return new Date().toUnixTime(); }

Ahora puedes usarlo donde quieras con simples llamadas:

// Get the current unix time: 
console.log(Date.time())

// Parse a date and get it as Unix time
console.log(new Date('Mon, 25 Dec 2010 13:30:00 GMT').toUnixTime())

Manifestación:

     
    Date.prototype.toUnixTime = function() { return this.getTime()/1000|0 };
    Date.time = function() { return new Date().toUnixTime(); }

    // Get the current unix time: 
    console.log("Current Time: " + Date.time())

    // Parse a date and get it as Unix time
    console.log("Custom Time (Mon, 25 Dec 2010 13:30:00 GMT): " + new Date('Mon, 25 Dec 2010 13:30:00 GMT').toUnixTime())

  • Debes evitar modificar los prototipos de objetos que no te pertenecen.

    – James Monger

    4 de diciembre de 2018 a las 12:06

En mecanografiado, simplemente ejecute Math.floor(new Date().getTime() / 1000)

> Math.floor(new Date().getTime() / 1000)
1581040613

Actualmente estoy ejecutando Node 13.7.0

Publicar ECMAScript5 puede usar:

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

que genera la marca de tiempo de la época en segundos.

Usando momentjs:

Las siguientes dos variables tienen el mismo valor: –

console.log(moment().format('X'))
console.log(moment.utc().format('X'))

Usando Date() incorporado:

console.log(new Date().getTime())   // including fractional seconds
console.log(Math.floor(new Date().getTime()/1000))    // up to seconds

el SDK de AWS incluye funciones de utilidad para convertir el formato de fecha de Amazon.

Por ejemplo, en una devolución de llamada desde un objeto de obtención de S3, hay una propiedad ‘LastModified’ que está en el formato de fecha de Amazon. (Parece que no están haciendo nada más que exportar la clase de fecha estándar para sus propiedades de fecha, como la propiedad ‘LastModified’ del objeto S3) Ese formato incluye algunas utilidades para varios formatos incorporados (desafortunadamente, ninguno para la época de Unix):

let awsTime = response.LastModified
console.log("Time Formats",{
    "String"           : awsTime.toString(),
    "JSON"             : awsTime.toJSON(),
    "UTCString"        : awsTime.toUTCString(),
    "TimeString"       : awsTime.toTimeString(),
    "DateString"       : awsTime.toDateString(),
    "ISOString"        : awsTime.toISOString(),
    "LocaleTimeString" : awsTime.toLocaleTimeString(),
    "LocaleDateString" : awsTime.toLocaleDateString(),
    "LocaleString"     : awsTime.toLocaleString()
})
/*
Time Formats {
  String: 'Fri Sep 27 2019 16:54:31 GMT-0400 (EDT)',
  JSON: '2019-09-27T20:54:31.000Z',
  UTCString: 'Fri, 27 Sep 2019 20:54:31 GMT',
  TimeString: '16:54:31 GMT-0400 (EDT)',
  DateString: 'Fri Sep 27 2019',
  ISOString: '2019-09-27T20:54:31.000Z',
  LocaleTimeString: '16:54:31',
  LocaleDateString: '2019-9-27',
  LocaleString: '2019-9-27 16:54:31'
}
*/

Sin embargo, la función utils de AWS incluye un módulo de ‘fecha’ con otras funciones, incluido un método unixTimestamp:

let awsTime = response.LastModified
let unixEpoch = Math.floor(AWS.util.date.unixTimestamp(awsTime))

Nota: este método devuelve un valor flotante de forma predeterminada. Por lo tanto, Math.floor()

Código de función de aws-sdk.js (último):

/**
 * @return [Integer] the UNIX timestamp value for the current time
 */
 unixTimestamp: function unixTimestamp(date) {
     if (date === undefined) { date = util.date.getDate(); }
     return date.getTime() / 1000;
 }

También hay métodos para rfc822 e iso8601

¿Ha sido útil esta solución?