¿Cómo formatear una fecha UTC como una cadena `AAAA-MM-DD hh: mm: ss` usando NodeJS?

242

Usando NodeJS, quiero formatear a Dateen el siguiente formato de cadena:

var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");

¿Cómo puedo hacer eso?

Tampa
fuente
44
Es una molestia prescindir de bibliotecas. Recomiendo usar datejs
Peter Olson
8
o momentjs
Mustafa
o Tempus
Dan D.
Tempus funcionó muy bien. Los problemas publicitarios llegarán en un momento.
Tampa
1
Ni Datejs ni Tempus son bibliotecas de nodos (aunque se pueden usar con Node, no se puede usar el instalador de la biblioteca npm). Como nadie los ha presentado como respuestas reales, lo hice yo mismo.
Julian Knight

Respuestas:

532

Si está utilizando Node.js, seguramente tendrá EcmaScript 5, y entonces Date tiene un toISOStringmétodo. Estás pidiendo una ligera modificación de ISO8601:

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'

Así que solo corta algunas cosas y listo:

new Date().toISOString().
  replace(/T/, ' ').      // replace T with a space
  replace(/\..+/, '')     // delete the dot and everything after
> '2012-11-04 14:55:45'

O, en una línea: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 es necesariamente UTC (también indicado por la Z final en el primer resultado), por lo que obtienes UTC por defecto (siempre es algo bueno).

marrón
fuente
44
Solución inteligente y simple que evita el uso de bibliotecas, ¡genial!
Wingman4l7
11
En caso de que obtenga un error, Object has no method 'toISOString'se perdiónew
allenhwkim
29
Una cosa a tener en cuenta es que el uso de expresiones regulares de esta manera es lento y ni siquiera las necesita aquí, esto: new Date().toISOString().replace('T', ' ').substr(0, 19)funciona bien.
Killah
2
Tenga en cuenta que al eliminar la zona horaria, ahora representa un momento diferente en el tiempo en cada zona horaria con un desplazamiento diferente.
RobG
1
@RobG Puede decir eso sobre cualquier representación de fecha y hora que no tenga una zona horaria explícita.
Phil
105

ACTUALIZACIÓN 2017-03-29: Se agregaron date-fns, algunas notas sobre Moment y Datejs
ACTUALIZACIÓN 2016-09-14: Se agregó SugarJS que parece tener algunas excelentes funciones de fecha / hora.


OK, ya que nadie ha proporcionado una respuesta real, aquí está la mía.

Una biblioteca es sin duda la mejor apuesta para manejar fechas y horas de manera estándar. Hay muchos casos extremos en los cálculos de fecha / hora, por lo que es útil poder transferir el desarrollo a una biblioteca.

Aquí hay una lista de las principales bibliotecas de formato de hora compatibles con Node:

  • Moment.js [ gracias a Mustafa ] "Una biblioteca de fechas javascript ligera (4.3k) para analizar, manipular y formatear fechas" - Incluye internacionalización, cálculos y formatos de fecha relativos - Actualización 2017-03-29 : No tan ligero más, pero sigue siendo la solución más completa, especialmente si necesita soporte de zona horaria.
  • date-fns [ agregado 2017-03-29, gracias a Fractalf ] Pequeño, rápido, funciona con objetos de fecha JS estándar. Gran alternativa a Moment si no necesita soporte de zona horaria.
  • SugarJS : una biblioteca auxiliar general que agrega características muy necesarias a los tipos de objetos integrados JavaScripts. Incluye algunas capacidades excelentes de fecha / hora.
  • Strftime - Justo lo que dice, agradable y simple
  • dateutil : este es el que solía usar antes de MomentJS
  • fecha de formato de nodo
  • TimeTraveller : "Time Traveler proporciona un conjunto de métodos de utilidad para manejar fechas. Desde sumar y restar hasta formatear. Time Traveler solo extiende los objetos de fecha que crea, sin contaminar el espacio de nombres global".
  • Tempus [gracias a Dan D] - ACTUALIZACIÓN: esto también se puede usar con Node y desplegarse con npm, vea los documentos

También hay bibliotecas que no son de nodo:

  • Datejs [gracias a Peter Olson] - no está empaquetado en npm o GitHub, por lo que no es tan fácil de usar con Node - ¡no es realmente recomendable ya que no está actualizado desde 2007!
Julian Knight
fuente
2
Esto también es muy relevante date-fns.org ( github.com/date-fns/date-fns )
Fractalf
Las personas detrás de Moment tienen un experimento llamado Luxon a partir de febrero de 2018 moment.github.io/luxon/index.html
alxndr
Gracias @alxndr, parece un reinicio útil.
Julian Knight
Momento + toISOString () en RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane
70

Hay una biblioteca para la conversión:

npm install dateformat

Luego escriba su requerimiento:

var dateFormat = require('dateformat');

Luego vincula el valor:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");

ver formato de fecha

Onder OZCAN
fuente
14
¿Qué es result.request_date?
Dan Dascalescu
45

No tengo nada en contra de las bibliotecas en general. En este caso, una biblioteca de uso general parece exagerada, a menos que otras partes del proceso de solicitud tengan muchas fechas.

Escribir pequeñas funciones de utilidad como esta también es un ejercicio útil tanto para programadores principiantes como expertos y puede ser una experiencia de aprendizaje para los novatos entre nosotros.

function dateFormat (date, fstr, utc) {
  utc = utc ? 'getUTC' : 'get';
  return fstr.replace (/%[YmdHMS]/g, function (m) {
    switch (m) {
    case '%Y': return date[utc + 'FullYear'] (); // no leading zeros required
    case '%m': m = 1 + date[utc + 'Month'] (); break;
    case '%d': m = date[utc + 'Date'] (); break;
    case '%H': m = date[utc + 'Hours'] (); break;
    case '%M': m = date[utc + 'Minutes'] (); break;
    case '%S': m = date[utc + 'Seconds'] (); break;
    default: return m.slice (1); // unknown code, remove %
    }
    // add leading zero if required
    return ('0' + m).slice (-2);
  });
}

/* dateFormat (new Date (), "%Y-%m-%d %H:%M:%S", true) returns 
   "2012-05-18 05:37:21"  */
HBP
fuente
25
Si bien esto puede ser útil para el aprendizaje, tendría que estar en desacuerdo con que este es un mejor resultado que usar una biblioteca pequeña y bien construida. Se mantendría una biblioteca y sería más probable que cubriera casos extremos en el diseño que podrían no ser obvios a primera vista pero que podrían morderse fácilmente en algún momento; los cálculos de fecha / hora son particularmente propensos a estos problemas debido a su complejidad inherente.
Julian Knight
8
Este es un muy buen uso del método String.replace (), +1 para la creatividad
JamieJag
55
No. Absolutamente use una biblioteca en este caso. El formato puede cambiar. Incluso si no cambia, esto está agregando complejidad al código. Otras personas que mantengan su código tendrían que pasar tiempo, tratando de comprender esta función y asegurándose de que sea correcta. Los ejercicios son para la escuela; La pregunta era sobre el uso en la vida real. A menos, por supuesto, que este sea su primer o segundo proyecto "real"; entonces puede ser bueno hacer algo así, para que pueda aprender por qué no debería hacerlo en el futuro.
osa
3
Aprecio el sentimiento general de usar bibliotecas como código probado / reforzado para la batalla, pero también pueden agregar complejidad de implementación. Este código delega todas las sutilezas relacionadas con el calendario al objeto Date subyacente y solo llama, por ejemplo, al método getUTCDate () en el lugar apropiado. Además, si alguien encuentra un error en este código, puede informarlo aquí en stackoverflow.com, esencialmente haciendo coincidir el aspecto de muchos ojos / errores superficiales de cualquier otra biblioteca. +1
vapor25 25 de
11

Forma fácil de leer y personalizar para obtener una marca de tiempo en el formato deseado, sin usar ninguna biblioteca:

function timestamp(){
  function pad(n) {return n<10 ? "0"+n : n}
  d=new Date()
  dash="-"
  colon=":"
  return d.getFullYear()+dash+
  pad(d.getMonth()+1)+dash+
  pad(d.getDate())+" "+
  pad(d.getHours())+colon+
  pad(d.getMinutes())+colon+
  pad(d.getSeconds())
}

(Si necesita tiempo en formato UTC, simplemente cambie las llamadas a funciones. Por ejemplo, "getMonth" se convierte en "getUTCMonth")

Mtl Dev
fuente
9

La biblioteca javascript sugar.js ( http://sugarjs.com/ ) tiene funciones para formatear fechas

Ejemplo:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
David Miró
fuente
3
Parece una biblioteca realmente asombrosa. Su formato es bastante elegante, y sus documentos muestran soluciones elegantes a otras cien cosas con las que me he sentido frustrado en JavaScript. Voy a probar esto.
Eimajenthat
6

Utilice el método proporcionado en el objeto Fecha de la siguiente manera:

var ts_hms = new Date();

console.log(
    ts_hms.getFullYear() + '-' + 
    ("0" + (ts_hms.getMonth() + 1)).slice(-2) + '-' + 
    ("0" + (ts_hms.getDate())).slice(-2) + ' ' +
    ("0" + ts_hms.getHours()).slice(-2) + ':' +
    ("0" + ts_hms.getMinutes()).slice(-2) + ':' +
    ("0" + ts_hms.getSeconds()).slice(-2));

Se ve muy sucio, pero debería funcionar bien con los métodos principales de JavaScript

jpmonette
fuente
2
Estoy de acuerdo en que necesita agregar 1 a getMonth () ya que enero vuelve como 0, pero no creo que quiera agregar 1 a getDate ().
Steve Onorato
5

Estoy usando dateformat en Nodejs y angularjs, tan bueno

Instalar en pc

$ npm install dateformat
$ dateformat --help

manifestación

var dateFormat = require('dateformat');
var now = new Date();

// Basic usage
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");
// Saturday, June 9th, 2007, 5:46:21 PM

// You can use one of several named masks
dateFormat(now, "isoDateTime");
// 2007-06-09T17:46:21

// ...Or add your own
dateFormat.masks.hammerTime = 'HH:MM! "Can\'t touch this!"';
dateFormat(now, "hammerTime");
// 17:46! Can't touch this!

// You can also provide the date as a string
dateFormat("Jun 9 2007", "fullDate");
// Saturday, June 9, 2007
...
Tính Ngô Quang
fuente
3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00
gest
fuente
Bienvenido a StackOverflow. Edite su respuesta, o podría ser rechazado. Tal como está ahora, es solo una sugerencia sin contexto. Por favor, vea aquí cómo escribir una buena respuesta .
jacefarm
Esto sucede con de-locale (de ahí el toLocaleString):3.2.2015, 15:30:00
alwe
2

Alternativa # 6233 ...

Agregue el desplazamiento UTC a la hora local y luego conviértalo al formato deseado con el toLocaleDateString()método del Dateobjeto:

// Using the current date/time
let now_local = new Date();
let now_utc = new Date();

// Adding the UTC offset to create the UTC date/time
now_utc.setMinutes(now_utc.getMinutes() + now_utc.getTimezoneOffset())

// Specify the format you want
let date_format = {};
date_format.year = 'numeric';
date_format.month = 'numeric';
date_format.day = '2-digit';
date_format.hour = 'numeric';
date_format.minute = 'numeric';
date_format.second = 'numeric';

// Printing the date/time in UTC then local format
console.log('Date in UTC: ', now_utc.toLocaleDateString('us-EN', date_format));
console.log('Date in LOC: ', now_local.toLocaleDateString('us-EN', date_format));

Estoy creando un objeto de fecha predeterminado a la hora local. Estoy agregando el UTC desplazado a él. Estoy creando un objeto con formato de fecha. Estoy mostrando la fecha / hora UTC en el formato deseado:

ingrese la descripción de la imagen aquí

Adán
fuente
1

Utilice el x-datemódulo que es uno de los submódulos de la biblioteca de clase x ;

require('x-date') ; 
  //---
 new Date().format('yyyy-mm-dd HH:MM:ss')
  //'2016-07-17 18:12:37'
 new Date().format('ddd , yyyy-mm-dd HH:MM:ss')
  // 'Sun , 2016-07-17 18:12:51'
 new Date().format('dddd , yyyy-mm-dd HH:MM:ss')
 //'Sunday , 2016-07-17 18:12:58'
 new Date().format('dddd ddSS of mmm , yy')
  // 'Sunday 17thth +0300f Jul , 16'
 new Date().format('dddd ddS  mmm , yy')
 //'Sunday 17th  Jul , 16'
Abdennour TOUMI
fuente
1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

con .toString (), esto se convierte en formato

reemplazar (/ T /, ''). // reemplaza T por '' 2017-01-15T ...

reemplazar (/..+/, '') // para ... 13: 50: 16.1271

ejemplo, vea var datey hour:

var date="2017-01-15T13:50:16.1271".toString("yyyyMMddHHmmss").
                    replace(/T/, ' ').      
                    replace(/\..+/, '');
    
                    var auxCopia=date.split(" ");
                    date=auxCopia[0];
                    var hour=auxCopia[1];

console.log(date);
console.log(hour);

x-rw
fuente
1
¿Puedes dar alguna explicación como contexto detrás de tu respuesta?
T-Heron
Bienvenido a StackOverflow. Edite su respuesta, o podría ser rechazado. Tal como está ahora, es solo una sugerencia sin contexto. Por favor, vea aquí cómo escribir una buena respuesta .
jacefarm
@ user7396942 - ahora votado para agregar contexto / explicación a su respuesta. Descargo de responsabilidad: no fui yo quien había votado anteriormente, ya que ahora se ve mucho mejor.
T-Heron
3
¿Por qué el .toString("yyyyMMddHHmmss")?
Arjan
1

Para formatear la fecha, la forma más fácil es usar moment lib. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Jazeb_007
fuente
Gracias, @ Jazeb_007 está funcionando para mí, aunque no lo necesito toISOString()ytoUTCString()
Bablu Ahmed
0
appHelper.validateDates = function (start, end) {
    var returnval = false;

    var fd = new Date(start);
    var fdms = fd.getTime();
    var ed = new Date(end);
    var edms = ed.getTime();
    var cd = new Date();
    var cdms = cd.getTime();

    if (fdms >= edms) {
        returnval = false;
        console.log("step 1");
    }
    else if (cdms >= edms) {
        returnval = false;
        console.log("step 2");
    }
    else {
        returnval = true;
        console.log("step 3");
    }
    console.log("vall", returnval)
    return returnval;
}
Benjamín
fuente
0

Verifique el código a continuación y el enlace a MDN

// var ts_hms = new Date(UTC);
// ts_hms.format("%Y-%m-%d %H:%M:%S")

// exact format
console.log(new Date().toISOString().replace('T', ' ').substring(0, 19))

// other formats
console.log(new Date().toUTCString())
console.log(new Date().toLocaleString('en-US'))
console.log(new Date().toString())

cata-lock
fuente
-1

Creo que esto realmente responde a tu pregunta.

Es muy molesto trabajar con fecha / hora en javascript. Después de algunas canas, descubrí que en realidad era bastante simple.

var date = new Date();
var year = date.getUTCFullYear();
var month = date.getUTCMonth();
var day = date.getUTCDate();
var hours = date.getUTCHours();
var min = date.getUTCMinutes();
var sec = date.getUTCSeconds();

var ampm = hours >= 12 ? 'pm' : 'am';
hours = ((hours + 11) % 12 + 1);//for 12 hour format

var str = month + "/" + day + "/" + year + " " + hours + ":" + min + ":" + sec + " " + ampm;
var now_utc =  Date.UTC(str);

Aquí hay un violín

J-Roel
fuente
Debe agregar 1 al mes que se basa en cero.
Mistic el