Comment puis-je afficher une chaîne formatée ISO 8601 en JavaScript?

J'ai un objet Date . Comment puis-je rendre la partie title de l'extrait suivant?

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

J'ai une portion de «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 cela me donne:

 "2010-4-2T3:19" 

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

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

Si, en quelque sorte, vous êtes sur un navigateur qui ne l'appuie pas, je vous ai couvert:

 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'; }; }() ); } 

Voir le dernier exemple de la page https://developer.mozilla.org/fr/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 

Presque toutes les méthodes ISO sur le Web supprime les informations du fuseau horaire en appliquant une conversion en "Z" ulu time (UTC) avant de sortir la chaîne. Le navigateur native .toISOString () supprime également les informations sur le fuseau horaire.

Cela supprime des informations précieuses, car le serveur ou le destinataire peut toujours convertir une date ISO complète en Zulu ou n'importe quelle fuseau horaire, tout en obtenant toujours l'information de l'expéditeur sur la fuseau horaire.

La meilleure solution que j'ai rencontrée est d'utiliser la bibliothèque javascript Moment.js et d'utiliser le code suivant:

Pour obtenir l'heure ISO actuelle avec des informations sur la fuseau horaire et des 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 Date JavaScript avec l'information de la fuseau horaire mais sans 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 telles que Date.today () dont le résultat peut ensuite être transmis au moment.

Une chaîne de date formatée comme celle-ci est compilateur JSON et se prête bien à être stockée dans une base de données. Python et C # semblent l'aimer.

La question posée était le format ISO avec une précision réduite. Voila:

  new Date().toISOString().slice(0, 19) + 'Z' // '2014-10-23T13:18:06Z' 

En supposant que le Z de fuite est recherché, sinon, simplement omettre.

Si vous ne devez pas supporter IE7, ce qui suit est un hack génial et concis:

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

Le plus court, mais pas pris en charge par Internet Explorer 8 et versions antérieures:

 new Date().toJSON() 

Il y a un '+' manquant après le 'T'

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

Devrait le faire.

Pour les zéros principaux, vous pouvez l'utiliser à partir d' ici :

 function PadDigits(n, totalDigits) { n = n.toString(); var pd = ''; if (totalDigits > n.length) { for (i=0; i < (totalDigits-n.length); i++) { pd += '0'; } } return pd + n.toString(); } 

En l'utilisant comme ceci:

 PadDigits(d.getUTCHours(),2) 

Je ne veux généralement pas afficher une date UTC puisque les clients n'aiment pas faire la conversion dans leur tête. Pour afficher une date ISO locale , j'utilise la fonction:

 function toLocalIsoString(date, includeSeconds) { function pad(n) { return n < 10 ? '0' + n : n } var localIsoString = date.getFullYear() + '-' + pad(date.getMonth() + 1) + '-' + pad(date.getDate()) + 'T' + pad(date.getHours()) + ':' + pad(date.getMinutes()) + ':' + pad(date.getSeconds()); if(date.getTimezoneOffset() == 0) localIsoString += 'Z'; return localIsoString; }; 

La fonction ci-dessus omite les informations de décalage du fuseau horaire (sauf si l'heure locale passe par UTC), alors j'utilise la fonction ci-dessous pour afficher le décalage local dans un seul emplacement. Vous pouvez également ajouter sa sortie aux résultats de la fonction ci-dessus si vous souhaitez afficher le décalage à chaque fois:

 function getOffsetFromUTC() { var offset = new Date().getTimezoneOffset(); return ((offset < 0 ? '+' : '-') + pad(Math.abs(offset / 60), 2) + pad(Math.abs(offset % 60), 2)) }; 

toLocalIsoString utilise pad . Si nécessaire, cela fonctionne comme presque n'importe quelle fonction pad, mais pour des raisons d'exhaustivité, c'est ce que j'utilise:

 // Pad a number to length using padChar function pad(number, length, padChar) { if (typeof length === 'undefined') length = 2; if (typeof padChar === 'undefined') padChar = '0'; var str = "" + number; while (str.length < length) { str = padChar + str; } return str; } 

Le problème avec toSOString est qu'il donne datetime uniquement comme "Z".

L'ISO-8601 définit également l'heure de la date avec la différence de la fuseau horaire en heures et en minutes, sous forme comme 2016-07-16T19: 20: 30 + 5: 30 (lorsque le fuseau horaire est en avance UTC) et 2016-07-16T19: 20: 30-01 : 00 (lorsque le fuseau horaire est derrière UTC).

Je ne pense pas que ce soit une bonne idée d'utiliser un autre plugin, moment.js pour une tâche aussi petite, surtout lorsque vous pouvez l'obtenir avec quelques lignes de code.

 var timezone_offset_min = new Date().getTimezoneOffset(), offset_hrs = parseInt(Math.abs(timezone_offset_min/60)), offset_min = Math.abs(timezone_offset_min%60), timezone_standard; if(offset_hrs < 10) offset_hrs = '0' + offset_hrs; if(offset_min > 10) offset_min = '0' + offset_min; // getTimezoneOffset returns an offset which is positive if the local timezone is behind UTC and vice-versa. // So add an opposite sign to the offset // If offset is 0, it means timezone is UTC if(timezone_offset_min < 0) timezone_standard = '+' + offset_hrs + ':' + offset_min; else if(timezone_offset_min > 0) timezone_standard = '-' + offset_hrs + ':' + offset_min; else if(timezone_offset_min == 0) timezone_standard = 'Z'; // Timezone difference in hours and minutes // String such as +5:30 or -6:00 or Z console.log(timezone_standard); 

Une fois que vous avez le décalage horaire en heures et en minutes, vous pouvez ajouter une chaîne de date-heure.

J'ai écrit un article sur le blog: http://usefulangle.com/post/30/javascript-get-date-time-with-offset-hours-minutes

Je voudrais simplement utiliser cette petite extension à Datehttp://blog.stevenlevithan.com/archives/date-time-format

 var date = new Date(msSinceEpoch); date.format("isoDateTime"); // 2007-06-09T17:46:21 
 function timeStr(d) { return ''+ d.getFullYear()+ ('0'+(d.getMonth()+1)).slice(-2)+ ('0'+d.getDate()).slice(-2)+ ('0'+d.getHours()).slice(-2)+ ('0'+d.getMinutes()).slice(-2)+ ('0'+d.getSeconds()).slice(-2); } 

J'ai pu obtenir un rendement inférieur à celui de très peu de code.

 var ps = new Date('2010-04-02T14:12:07') ; ps = ps.toDateString() + " " + ps.getHours() + ":"+ ps.getMinutes() + " hrs"; 

Sortie:

 Fri Apr 02 2010 19:42 hrs 
 function getdatetime() { d = new Date(); return (1e3-~d.getUTCMonth()*10+d.toUTCString()+1e3+d/1) .replace(/1(..)..*?(\d+)\D+(\d+).(\S+).*(...)/,'$3-$1-$2T$4.$5Z') .replace(/-(\d)T/,'-0$1T'); } 

J'ai trouvé les bases sur le débordement de Stack quelque part (je crois que cela faisait partie d'un autre code de pilotage Stack Exchange), et je l'ai amélioré, donc cela fonctionne aussi sur Internet Explorer 10 ou plus tôt. C'est moche, mais ça fait le travail.