Je travaille sur un projet où l'on me donne le format date/heure de Microsoft, qui semble être exactement comme un ISO formatting standard.Moment.js ne supporte pas le format Microsoft/ISO?
Lorsque j'essaie de formater une date avec Moment.js, elle ne s'affiche pas correctement. Par exemple, le format dont je dispose comporte «yy» pour l'année à deux chiffres et «d» pour un jour à un chiffre.
Lorsque je regarde la documentation Moment.js format, je réalise qu'il ne supporte même pas? C'est un peu étrange? Pourquoi ne supporterait-il pas une norme?
Ou est-ce que je fais quelque chose de mal? Est-ce que je manque quelque chose?
Je déteste vraiment essayer d'écrire un convertisseur de format ISO vers Moment.js.
Est-ce que quelqu'un a eu les mêmes problèmes? Si oui, comment avez-vous résolu cela?
Mise à jour 16/10/2017 17:32:
Après avoir obtenu une bonne question de Matt Johnson dans le commentaire, j'ai lu mon post et encore une fois réalisé que je travaille depuis si longtemps ce projet web "embarqué" que je n'étais probablement pas très clair quant à ce que l'on entend par "windows me donnant un format de date". Donc, j'ai écrit ce qui suit en réponse à sa question:
@MattJohnson, ce que je veux dire, c'est que le projet web sur lequel je travaille pour un client est un IE embarqué (OLE) dans une application Windows (binaire compilé, pas web). La partie JavaScript de l'application Web "parle" à l'application de bureau afin de recevoir/envoyer des données. Une des données que je reçois est une propriété "dateFormat" et "timeFormat". On me dit que les valeurs que je reçois proviennent directement de la machine Windows (en fonction de la configuration de l'utilisateur de ce système d'exploitation). Il arrive que les années/jours sont tous en minuscules, ce qui fait que Moment.js ne peut pas formater les dates correctement. Ainsi, la conversion que j'ai maintenant.
Exemples:
Appel
instant() format();.
Produira
"2017-10-13T13: 24: 47-04: 00"
Maintenant, si je veux le formater selon la documentation Moment.js , Je ferais ceci:
moment().format ('MM/JJ/AAAA');
Pour obtenir:
"13/10/2017"
Le problème est que Windows passe le long de ce format:
« dd/MM/yyyy "
Ainsi quand j'appelle Moment avec, comme:
moment(). format ('jj/MM/aaaa');
me donner ceci:
"Ve/30/aaaa"
Alors que je me attendais à ceci:
13/10/2017
Quand je regarde beaucoup d'autres da Pour les bibliothèques de formatage, je vois qu'elles supportent toutes la structure 'yyyy', 'dd' et 'MM'. Mais pas Moment.js.
Mise à jour 13/10/2017 16:41:
Je l'ai fait une comparaison du format de date/heure de Microsoft à celle de Moment.js et vu les différences.
* ---------------------------------------------------------------------------------------------
* Unit Microsoft Examples Moment.js Differnces?
* ---------------------------------------------------------------------------------------------
* day d, dd 1, 01 D, DD Yes, case
* day of week ddd, dddd Fri, Friday ddd, dddd None
* month M, MM, MMM, MMMM 8, 08, Oct., October M, MM, MMM, MMMM None
* year yy, yyyy 17, 2017 YY, YYYY Yes, case
*
* hour h, hh, H, HH 3, 03, 15, 15 h, hh, H, HH None
* minutes m, mm 9, 09 m, mm None
* seconds s, ss 5, 05 s, ss None
*/
En utilisant cette information, je me suis vite écrit une fonction de conversion de format:
function windowsFormatToMomentJSFormat(windowsFormat) {
var format = windowsFormat;
console.log("Converting date format...");
if (!windowsFormat) return format;
console.log(" > From : '" + windowsFormat + "'");
format = format.replace(/y/g, 'Y'); // Fix case for years
format = format.replace(/d{4}/g, '#'); // Protect 4-digit DOW sequence
format = format.replace(/d{3}/g, '&'); // Protect 3-digit DOW sequence
format = format.replace(/d/g, 'D'); // Fix case for days
format = format.replace(/#/g, 'dddd'); // Restore our sequence
format = format.replace(/&/g, 'ddd'); // Restore our sequence
console.log(" > To : '" + format + "'");
console.log(" > Applied : '" + moment().format(format) + "'");
return format;
}
Il semble bien fonctionner, même si je voudrais être beaucoup mieux à REGEX avancée afin d'optimiser la fonction et retirez la protéger/restaurer le code. Donc, maintenant, mes chaînes de format Windows semblent être traitées correctement par la fonction format() de Moment.js.
Je ne comprends pas ce que vous devez faire. Passez-vous une date à moment.js d'ASP.NET? – Dmitry
@Dmitry J'ai mis à jour mes questions avec quelques exemples. J'espère que cela pourra aider. – Jeach
Je suis assez sûr que ISO8601 ne définit pas quelles légendes utiliser parseurs de date et les formateurs. Ce sont des bibliothèques/PL spécifiques. ISO8601 spécifie le format de date lui-même. 'moment(). format();' produit une date-heure dans ce format ISO. Et il semble que 'moment' utilise des légendes de https://www.w3.org/TR/NOTE-datetime. Python utilise par exemple un format de légende complètement différent https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior. Et d'ailleurs, votre 'jj/mm/aaaa 'contredit complètement ISO. – Dmitry