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

242

En utilisant NodeJS, je souhaite formater un Datedans le format de chaîne suivant:

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

Comment je fais ça?

Tampa
la source
4
C'est un peu la peine de se passer de bibliothèques. Je recommande d'utiliser datejs
Peter Olson
8
or momentjs
Mustafa
ou Tempus
Dan D.
Tempus a très bien fonctionné. Les problèmes d'annonces vont arriver.
Tampa
1
Ni Datejs ni Tempus ne sont des bibliothèques Node (bien qu'elles puissent être utilisées avec Node, vous ne pouvez pas utiliser le programme d'installation de la bibliothèque npm). Comme personne n'a présenté ces réponses comme de vraies réponses, je l'ai fait moi-même.
Julian Knight

Réponses:

532

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

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

Donc, coupez quelques choses et vous êtes prêt:

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 seule 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 (toujours une bonne chose).

chbrown
la source
4
Solution intelligente et simple qui évite l'utilisation de bibliothèques - sympa!
Wingman4l7
11
Au cas où vous auriez une erreur, Object has no method 'toISOString'vous avez raténew
allenhwkim
29
Une chose à noter est que l'utilisation d'expressions régulières de cette façon est lente et que vous n'en avez même pas besoin ici, ceci: new Date().toISOString().replace('T', ' ').substr(0, 19)fonctionne très bien.
Killah
2
Notez qu'en supprimant le fuseau horaire, il représente désormais un moment différent dans chaque fuseau horaire avec un décalage différent.
RobG
1
@RobG Vous pouvez dire cela à propos de toute représentation date-heure qui n'a pas de fuseau horaire explicite.
Phil
105

MISE À JOUR 2017-03-29: Ajout de date-fns, quelques notes sur Moment et Datejs
MISE À JOUR 2016-09-14: Ajout de SugarJS qui semble avoir d'excellentes fonctions date / heure.


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

Une bibliothèque est certainement le meilleur choix pour gérer les dates et heures de manière standard. Il existe de nombreux cas marginaux dans les calculs de date / heure, il est donc utile de pouvoir transférer le développement à une bibliothèque.

Voici une liste des principales bibliothèques de formatage d'heure compatibles avec les nœuds:

  • Moment.js [ merci à Mustafa ] "Une bibliothèque de dates javascript légère (4.3k) pour analyser, manipuler et formater les dates" - Inclut l'internationalisation, les calculs et les formats de date relatifs - Mise à jour 2017-03-29 : Pas tout à fait aussi léger plus mais toujours la solution la plus complète, surtout si vous avez besoin d'un support de fuseau horaire.
  • date-fns [ ajouté le 29/03/2017, grâce à Fractalf ] Petit, rapide, fonctionne avec les objets de date JS standard. Excellente alternative à Moment si vous n'avez pas besoin de prise en charge du fuseau horaire.
  • SugarJS - Une bibliothèque d'aide générale ajoutant des fonctionnalités indispensables aux types d'objets intégrés JavaScripts. Comprend d'excellentes capacités de date / heure.
  • strftime - Juste ce qu'il dit, simple et agréable
  • dateutil - C'est celui que j'utilisais avant MomentJS
  • date de format du nœud
  • TimeTraveller - "Time Traveler fournit un ensemble de méthodes utilitaires pour gérer les dates. De l'ajout et de la soustraction au formatage. Time Traveler étend uniquement les objets de date qu'il crée, sans polluer l'espace de noms global."
  • Tempus [merci à Dan D] - MISE À JOUR: ceci peut également être utilisé avec Node et déployé avec npm, voir la documentation

Il existe également des bibliothèques non-Node:

  • Datejs [merci à Peter Olson] - pas emballé dans npm ou GitHub donc pas si facile à utiliser avec Node - pas vraiment recommandé car non mis à jour depuis 2007!
Julian Knight
la source
2
Ceci est également très pertinent date-fns.org ( github.com/date-fns/date-fns )
Fractalf
Les personnes derrière Moment ont une expérience appelée Luxon en février 2018 moment.github.io/luxon/index.html
alxndr
Merci @alxndr, ressemble à un redémarrage utile.
Julian Knight
Moment + toISOString () sur RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane
70

Il y a une bibliothèque pour la conversion:

npm install dateformat

Écrivez ensuite votre exigence:

var dateFormat = require('dateformat');

Liez ensuite la valeur:

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

voir dateformat

Onder OZCAN
la source
14
Qu'est-ce que c'est result.request_date?
Dan Dascalescu
45

Je n'ai rien contre les bibliothèques en général. Dans ce cas, une bibliothèque à usage général semble exagérée, sauf si d'autres parties du processus de demande datent fortement.

L'écriture de petites fonctions utilitaires comme celle-ci est également un exercice utile pour les programmeurs débutants et confirmés et peut être une expérience d'apprentissage pour les novices parmi 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"  */
HBP
la source
25
Bien que cela puisse effectivement être utile pour l'apprentissage, je ne serais pas d'accord pour dire que c'est un meilleur résultat que d'utiliser une petite bibliothèque bien construite. Une bibliothèque serait maintenue et serait plus susceptible de couvrir des cas marginaux dans la conception qui pourraient ne pas être évidents à première vue mais pourraient facilement mordre à un moment donné - les calculs de date / heure sont particulièrement sujets à ces problèmes en raison de leur complexité inhérente.
Julian Knight
8
C'est une très bonne utilisation de la méthode String.replace (), +1 pour la créativité
JamieJag
5
Non. Utilisez absolument 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 qui gèrent votre code devraient passer du temps à essayer de comprendre cette fonction et à s'assurer qu'elle est correcte. Les exercices sont pour l'école; la question portait sur l'utilisation réelle. A moins, bien sûr, qu'il ne s'agisse de votre premier ou deuxième "vrai" projet; alors il peut être bon de faire quelque chose comme ça, afin que vous puissiez comprendre pourquoi vous ne devriez pas le faire à l'avenir.
osa
3
J'apprécie le sentiment général d'utiliser des bibliothèques comme du code éprouvé / éprouvé mais elles peuvent également ajouter de la complexité au déploiement. Ce code délègue toutes les subtilités liées au calendrier à l'objet Date sous-jacent et appelle simplement, par exemple, la méthode getUTCDate () à l'endroit approprié. De plus, si quelqu'un trouve un bogue dans ce code, il peut le signaler ici sur stackoverflow.com, correspondant essentiellement à l'aspect à plusieurs yeux / bogues superficiels de toute autre bibliothèque. +1
steamer25
11

Manière facilement lisible et personnalisable pour obtenir un horodatage au format souhaité, sans utiliser de bibliothèque:

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 vous avez besoin de temps au format UTC, modifiez simplement les appels de fonction. Par exemple, "getMonth" devient "getUTCMonth")

Mtl Dev
la source
9

La bibliothèque javascript sugar.js ( http://sugarjs.com/ ) a des fonctions pour formater les dates

Exemple:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
David Miró
la source
3
On dirait une bibliothèque vraiment géniale. Leur formatage est assez lisse et leurs documents présentent des solutions élégantes à une centaine d'autres choses qui m'ont frustré en JavaScript. Je vais essayer.
eimajenthat
6

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

Il semble vraiment sale, mais cela devrait fonctionner correctement avec les méthodes de base JavaScript

jpmonette
la source
2
Je suis d'accord que vous devez ajouter 1 à getMonth () puisque janvier revient à 0, mais je ne pense pas que vous vouliez ajouter 1 à getDate ().
Steve Onorato
5

J'utilise dateformat chez Nodejs et angularjs, donc bon

installer

$ npm install dateformat
$ dateformat --help

démo

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
la source
3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00
geste
la source
Bienvenue dans StackOverflow. Veuillez modifier votre réponse, sinon vous pourriez être rejeté. Dans l'état actuel des choses, ce n'est qu'une suggestion sans contexte. Veuillez consulter ici pour savoir comment rédiger une bonne réponse .
jacefarm
Cela se produit avec de-locale (d'où le toLocaleString):3.2.2015, 15:30:00
alwe
2

Alternative # 6233 ....

Ajoutez le décalage UTC à l'heure locale puis convertissez-le au format souhaité avec la toLocaleDateString()méthode de l' Dateobjet:

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

Je crée un objet de date par défaut à l'heure locale. J'y ajoute le décalage UTC. Je crée un objet de mise en forme de date. J'affiche la date / heure UTC au format souhaité:

entrez la description de l'image ici

Adam
la source
1

Utilisez le x-datemodule qui est l'un des sous-modules de la bibliothèque de classe 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
la source
1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

avec .toString (), cela devient au format

remplacer (/ T /, ''). // remplace T par '' 2017-01-15T ...

remplacer (/..+/, '') // pour ... 13: 50: 16.1271

exemple, voir var dateet 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
la source
1
Pouvez-vous fournir une explication comme contexte derrière votre réponse?
T-Heron
Bienvenue dans StackOverflow. Veuillez modifier votre réponse, sinon vous pourriez être rejeté. Dans l'état actuel des choses, ce n'est qu'une suggestion sans contexte. Veuillez consulter ici pour savoir comment rédiger une bonne réponse .
jacefarm
@ user7396942 - maintenant voté pour l'ajout de contexte / explication dans votre réponse. Avis de non-responsabilité: ce n'était pas moi qui avais précédemment voté contre, car à l'heure actuelle, il semble beaucoup mieux.
T-Heron
3
Pourquoi .toString("yyyyMMddHHmmss")?
Arjan
1

Pour le formatage de la date, le moyen le plus simple est d'utiliser moment lib. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Jazeb_007
la source
Merci, @ Jazeb_007 ça marche pour moi même je n'en ai pas besoin toISOString()ettoUTCString()
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;
}
Benjamin
la source
0

Vérifiez le code ci-dessous et le lien vers 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
la source
-1

Je pense que cela répond en fait à votre question.

C'est tellement ennuyeux de travailler avec la date / l'heure en javascript. Après quelques cheveux gris, j'ai compris que c'était en fait assez 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);

Voici un violon

J-Roel
la source
Vous devez ajouter 1 au mois qui est basé sur zéro.
Mistic