299 votes

Comment formater une date UTC en chaîne `YYYY-MM-DD hh:mm:ss` avec NodeJS ?

En utilisant NodeJS, je souhaite mettre en forme un fichier Date dans le format de chaîne suivant :

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

Comment faire ?

4 votes

C'est un peu ennuyeux de le faire sans bibliothèque. Je recommande d'utiliser datejs

8 votes

0 votes

Ou Tempus

633voto

chbrown Points 1517

Si vous utilisez Node.js, vous êtes sûr d'avoir EcmaScript 5, et donc Date a une fonction toISOString méthode. Vous demandez une légère modification de la norme ISO8601 :

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

Il suffit donc de couper quelques éléments, et le tour est joué :

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

Ou, en une ligne : new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 est nécessairement UTC (également indiqué par le Z de fin sur le premier résultat), vous obtenez donc UTC par défaut (ce qui est toujours une bonne chose).

4 votes

Une solution astucieuse et simple qui évite l'utilisation de bibliothèques sympa !

13 votes

En cas d'erreur, Object has no method 'toISOString' vous avez manqué new

45 votes

Une chose à noter est que l'utilisation des expressions régulières de cette manière est lente et que vous n'en avez même pas besoin ici : new Date().toISOString().replace('T', ' ').substr(0, 19) fonctionne parfaitement.

115voto

Julian Knight Points 2199

MISE À JOUR 2021-10-06 : Ajout de Day.js et suppression de l'édition parasite par @ashleedawg
MISE À JOUR 2021-04-07 : Luxon ajouté par @Tampa.
MISE À JOUR 2021-02-28 : Il faut maintenant noter que Moment.js n'est plus activement développé. Il ne disparaîtra pas rapidement car il est intégré dans beaucoup d'autres choses. Le site web propose quelques recommandations pour alternatives et en expliquer les raisons.
MISE À JOUR 2017-03-29 : Ajout de date-fns, quelques notes sur Moment et Datejs.
MISE À JOUR 2016-09-14 : Ajouté SugarJS qui semble avoir d'excellentes fonctions de date/heure.


OK, puisque personne n'a fourni de réponse réelle, voici la mienne.

Une bibliothèque est certainement la meilleure solution pour gérer les dates et les heures de manière standard. Les calculs de date et d'heure comportent de nombreux cas limites et il est donc utile de pouvoir confier le développement à une bibliothèque.

Voici une liste des principaux Nœud compatibles avec les bibliothèques de formatage de l'heure :

  • Jour.js [ ajouté 2021-10-06 ] "Une alternative rapide à Moment.js avec la même API moderne"
  • Luxon [ ajouté le 2017-03-29, merci à Tampa ] "Une enveloppe puissante, moderne et conviviale pour les dates et les heures en JavaScript. - MomentJS a été reconstruit à partir de zéro avec des types immuables, le chaînage et bien plus encore.
  • Moment.js [ grâce à Mustafa ] "Une bibliothèque de date javascript légère (4.3k) pour analyser, manipuler et formater les dates" - Inclut l'internationalisation, les calculs et les formats de date relative - Mise à jour 2017-03-29 : Plus aussi léger, mais toujours la solution la plus complète, surtout si vous avez besoin de la prise en charge des fuseaux horaires. - Mise à jour 2021-02-28 : N'est plus en développement actif.
  • date-fns [ ajouté le 2017-03-29, merci à Fractalf ] Petit, rapide, fonctionne avec les objets date standard de JS. Une bonne alternative à Moment si vous n'avez pas besoin du support des fuseaux horaires.
  • SugarJS - Une bibliothèque d'aide générale ajoutant des fonctionnalités indispensables aux types d'objets intégrés de JavaScripts. Inclut d'excellentes capacités de gestion de la date et de l'heure.
  • strftime - Juste ce qu'il faut, beau et simple
  • dateutil - C'est celui que j'utilisais avant MomentJS
  • node-formatdate
  • TimeTraveller - Time Traveller fournit un ensemble de méthodes utilitaires pour traiter les dates. De l'addition à la soustraction, en passant par le formatage. Time Traveller n'étend que les objets date qu'il crée, sans polluer l'espace de noms global."
  • Tempus [ grâce à Dan D ] - MISE À JOUR : ceci peut également être utilisé avec Node et déployé avec npm, voir la documentation.

Il existe également des non-Nœud bibliothèques :

  • Datejs [ grâce à Peter Olson Il n'est pas vraiment recommandé car il n'a pas été mis à jour depuis 2007 !

2 votes

Ceci est également très pertinent date-fns.org ( github.com/date-fns/date-fns )

0 votes

Les personnes à l'origine de Moment ont mené une expérience appelée Luxon en février 2018. moment.github.io/luxon/index.html

0 votes

Merci @alxndr, ça a l'air d'être un reboot utile.

79voto

Inna Kamoze Points 197

Il existe une bibliothèque pour la conversion :

npm install dateformat

Ensuite, écrivez votre demande :

var dateFormat = require('dateformat');

Puis lier la valeur :

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

voir format de données

48voto

HBP Points 6676

Je n'ai rien contre les bibliothèques en général. Dans le cas présent, une bibliothèque à usage général semble superflue, à moins que d'autres parties du processus d'application ne soient très datées.

L'écriture de petites fonctions utilitaires comme celle-ci est également un exercice utile pour les programmeurs débutants comme pour les programmeurs chevronnés et peut constituer une expérience d'apprentissage pour les novices d'entre nous.

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"  */

28 votes

Bien que cela puisse être utile pour l'apprentissage, je ne suis pas d'accord pour dire que c'est un meilleur résultat que l'utilisation d'une petite bibliothèque bien construite. Une bibliothèque serait entretenue et serait plus susceptible de couvrir les cas limites de la conception qui peuvent ne pas être évidents à première vue, mais qui pourraient facilement se faire sentir à un moment donné - les calculs de date et d'heure sont particulièrement sujets à ces problèmes en raison de leur complexité inhérente.

8 votes

C'est une très bonne utilisation de la méthode String.replace(), +1 pour la créativité

7 votes

Non. Il faut absolument utiliser une bibliothèque dans ce cas. Le format peut changer. Même s'il ne change pas, cela ajoute de la complexité au code. Les autres personnes chargées de la maintenance de votre code devront passer du temps à essayer de comprendre cette fonction et à s'assurer qu'elle est correcte. Les exercices sont destinés à l'école ; la question portait sur l'utilisation dans la vie réelle. À moins, bien sûr, qu'il ne s'agisse de votre premier ou deuxième projet "réel" ; dans ce cas, il peut être utile de faire quelque chose comme cela, afin d'apprendre pourquoi vous ne devriez pas le faire à l'avenir.

7voto

jpmonette Points 362

Utilisez la méthode fournie dans l'objet Date comme suit :

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));

Cela a l'air vraiment sale, mais cela devrait fonctionner correctement avec les méthodes de base de JavaScript

2 votes

Je suis d'accord qu'il faut ajouter 1 à getMonth() puisque January revient à 0, mais je ne pense pas qu'il faille ajouter 1 à getDate().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X