2017-10-13 2 views
0

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.

+0

Je ne comprends pas ce que vous devez faire. Passez-vous une date à moment.js d'ASP.NET? – Dmitry

+0

@Dmitry J'ai mis à jour mes questions avec quelques exemples. J'espère que cela pourra aider. – Jeach

+0

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

Répondre

1

Oui, vous aurez besoin d'une fonction de conversion, car les jetons de formatage de date/heure sont différents sur différentes bibliothèques et plates-formes. Il n'y en a pas un déjà développé, que je sache.

Notez qu'il manque plusieurs jetons à votre fonction actuelle.En particulier, le séparateur am/pm nécessite une traduction, et vous devriez également penser aux littéraux et aux séquences d'échappement.

+0

Merci Matt pour ton post avec ses liens et tout. En ce qui concerne ma fonction, oui, je réalise qu'il manque des conversions comme vous l'avez souligné. J'ai juste besoin du strict minimum pour avancer. Je vais essayer de contacter les gars de Moment.js pour voir s'ils envisagent d'ajouter du support pour les différents formateurs. Je vais accepter votre réponse comme plus utile (avec vos commentaires). Merci! – Jeach