336 votes

Comment produire une chaîne formatée ISO 8601 en JavaScript ?

J'ai un Date objet. Comment rendre le title de l'extrait suivant ?

<abbr title="2010-04-02T14:12:07">A couple days ago</abbr>

J'ai la partie "temps relatif en mots" d'une autre bibliothèque.

J'ai essayé ce qui suit :

function isoDate(msSinceEpoch) {

   var d = new Date(msSinceEpoch);
   return d.getUTCFullYear() + '-' + (d.getUTCMonth() + 1) + '-' + d.getUTCDate() + 'T' +
          d.getUTCHours() + ':' + d.getUTCMinutes() + ':' + d.getUTCSeconds();

}

Mais ça me donne :

"2010-4-2T3:19"

597voto

Anatoly Mironov Points 2398

Il existe déjà une fonction appelée toISOString() :

var date = new Date();
date.toISOString(); //"2011-12-19T15:28:46.493Z"

Si, d'une manière ou d'une autre, vous êtes sur un navigateur qui ne le supporte pas, je vous couvre :

if (!Date.prototype.toISOString) {
  (function() {

    function pad(number) {
      var r = String(number);
      if (r.length === 1) {
        r = '0' + r;
      }
      return r;
    }

    Date.prototype.toISOString = function() {
      return this.getUTCFullYear() +
        '-' + pad(this.getUTCMonth() + 1) +
        '-' + pad(this.getUTCDate()) +
        'T' + pad(this.getUTCHours()) +
        ':' + pad(this.getUTCMinutes()) +
        ':' + pad(this.getUTCSeconds()) +
        '.' + String((this.getUTCMilliseconds() / 1000).toFixed(3)).slice(2, 5) +
        'Z';
    };

  }());
}

console.log(new Date().toISOString())

10 votes

.toISOString() renvoie définitivement la date en UTC ?

1 votes

new Date("xx").toISOString() produit NaN-NaN-NaNTNaN:NaN:NaN.NZ L'implémentation native lève l'exception RangeException.

1 votes

Si vous voulez passer un objet date à un service soap... c'est la solution ! :) Merci.

69voto

dev-null-dweller Points 19874

Voir le dernier exemple à la page https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference:Global_Objects:Date :

/* Use a function for the exact format desired... */
function ISODateString(d) {
    function pad(n) {return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
         + pad(d.getUTCMonth()+1)+'-'
         + pad(d.getUTCDate())+'T'
         + pad(d.getUTCHours())+':'
         + pad(d.getUTCMinutes())+':'
         + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // Prints something like 2009-09-28T19:03:12Z

2 votes

L'échantillon fourni par le PO ( <abbr title="2010-04-02T14:12:07"> ) n'a pas de fuseau horaire. Peut-être voulaient-ils l'heure locale, ce qui serait logique pour une chaîne de temps d'interface utilisateur ?

68voto

Daniel F. Points 836

Nota : Cette réponse obtient toujours des upvotes en date du 2022-03. Le site moment.js La bibliothèque est déprécié . Ce sont les deux principales alternatives : Luxon y Jour.js d'autres sont mentionnés dans le lien de dépréciation.

Luxon

Luxon peut être considéré comme l'évolution de Moment. Il est écrit par Isaac Cambron un collaborateur de longue date de Moment. Veuillez lire Pourquoi Luxon existe-t-il ? et le Pour les utilisateurs de Moment pages dans le Luxon de Luxon.

Locales : Intl fourni Fuseaux horaires : Fourni en interne

Jour.js

Day.js est conçu pour être un remplacement minimaliste de Moment.js, en utilisant une API similaire. Il ne s'agit pas d'un remplacement direct, mais si vous avez l'habitude de l'API de Moment et que vous souhaitez vous lancer rapidement, envisagez d'utiliser Day.js.

Locales : Fichiers de données personnalisés qui peuvent être importés individuellement. Zones : Intl fourni, via un plugin

J'utilise Day.js à cause de la différence de taille, mais Luxon est plus facile à gérer.


Presque toutes les méthodes to-ISO sur le web suppriment les informations relatives au fuseau horaire en appliquant une conversion en heure "Z "ulu (UTC) avant de sortir la chaîne. La méthode native .toISOString() du navigateur supprime également les informations relatives au fuseau horaire.

Cela élimine des informations précieuses, car le serveur, ou le destinataire, peut toujours convertir une date ISO complète en heure zouloue ou en tout autre fuseau horaire dont il a besoin, tout en obtenant les informations sur le fuseau horaire de l'expéditeur.

La meilleure solution que j'ai trouvée est d'utiliser la fonction Moment.js et utilisez le code suivant :

Pour obtenir l'heure ISO actuelle avec des informations sur le fuseau horaire et les millisecondes

now = moment().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T20:11:11.234+0100"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss.SSSZZ")
// "2013-03-08T19:11:11.234+0000"

now = moment().utc().format("YYYY-MM-DDTHH:mm:ss") + "Z"
// "2013-03-08T19:11:11Z" <- better use the native .toISOString() 

Pour obtenir l'heure ISO d'un objet Date JavaScript natif avec des informations sur le fuseau horaire mais sans les millisecondes

var current_time = Date.now();
moment(current_time).format("YYYY-MM-DDTHH:mm:ssZZ")

Cela peut être combiné avec Date.js pour obtenir des fonctions comme Date.today() dont le résultat peut ensuite être transmis à moment.

Une chaîne de date formatée de la sorte est compilable en JSON, et se prête bien au stockage dans une base de données. Python et C# semblent l'apprécier.

25 votes

Ne te mêle pas des affaires des autres. Utilisez simplement moment.js et économisez vos cheveux.

1 votes

En fait, avec Python et les bases de données, cela s'est avéré être un problème. Les bases de données utilisent l'UTC (pas de problème, car vous pouvez facilement le convertir en UTC côté serveur), donc si vous voulez conserver les informations de décalage, vous avez besoin d'un autre champ. Et Python préfère l'utilisation de nanosecondes au lieu des millisecondes de javascript, qui sont généralement suffisantes et préférables aux secondes. Sous Python, seulement dateutil.parser.parse l'analyse correctement, et pour écrire des ISO en millisecondes il faut un "_when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z") ; return _when[:-8] + _when[-5 :]" pour convertir les nanos en millis. ce n'est pas joli.

3 votes

Vous pouvez en fait omettre le format comme ceci : moment(new Date()).format() . "À partir de la version 1.5.0, l'appel à moment#format sans format sera remplacé par défaut par ... le format ISO8601. YYYY-MM-DDTHH:mm:ssZ ". Doc : Faites défiler vers le haut à partir de momentjs.com/docs/#/displaying/fromnow

18voto

younes0 Points 613

Le plus court, mais non pris en charge par Internet Explorer 8 et antérieurs :

new Date().toJSON()

15voto

Russell Davis Points 2949

Si vous n'avez pas besoin de prendre en charge IE7, ce qui suit est une excellente solution concise :

console.log(
  JSON.parse(JSON.stringify(new Date()))
)

0 votes

Pour IE7, cette décision est également adaptée si l'on inclut json3-library ( bestiejs.github.io/json3 ). Merci :)

0 votes

Échec également dans IE8. ("'JSON' est indéfini")

1 votes

Faire des allers-retours dans le JSON est laid, surtout si votre objectif déclaré est la concision ; utilisez la fonction toJSON à la place. JSON.stringify l'utilise sous la couverture de toute façon.

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