Moment: Recherchez l'indicateur meridiem lors de la correspondance du format iso

Créé le 23 févr. 2016  ·  15Commentaires  ·  Source: moment/moment

Comme présenté dans #2983, l'utilisation du format de date "2016-02-23 11:31:23 PM" correspondra à un format ISO, même si ce n'est pas le cas. Cela provoque l'analyse d'une date erronée :

moment('2016-02-23 11:31:23 PM').format() = "2016-02-23T11:31:23-06:00"

C'est parce que 2016-02-23 11:31:23 est techniquement un format ISO.
Nous devons modifier le fichier from-string pour rechercher un indicateur méridiem et faire autre chose que de faire correspondre le format ISO s'il existe.

Bug Forgiving parsing

Tous les 15 commentaires

Aie! Celui-là a l'air de mordre quelqu'un à coup sûr. Pas d'avertissement de dépréciation non plus.

On dirait qu'il suffit peut-être de s'assurer que le vérificateur ISO va jusqu'à la fin de la chaîne, par exemple en ajoutant un $ à la fin de extendedIsoRegex et basicIsoRegex .

@icambron Je ne pense pas que nous puissions faire ça. Actuellement, le test suivant réussit :

    assert.ok(moment('2016-01-01 is my date').isValid(), 'test extra chars after iso date')

C'est presque une certitude qu'il y a quelqu'un dans le monde qui fait ça. Changez l'expression régulière et ce test échoue (ainsi que quelques autres que je n'ai pas encore recherchés).

Hum, d'accord. Mon avis serait de déprécier cela et de corriger ce problème AM/PM lorsque nous abandonnerons le support pour cela. Je ne vois pas de bonne raison pour laquelle nous _devrions_ soutenir moment('2016-01-01 is my date')

J'y ai un peu réfléchi et je me demande en quelque sorte si la réponse la moins invasive à certains des problèmes d'analyseur que nous rencontrons - comme celui-ci - serait de faire passer l'analyseur par défaut en mode strict. Il semble que le plus souvent, les problèmes d'analyse syntaxique (comme celui-ci) soient résolus en passant en mode strict (parce que l'utilisateur aurait dû utiliser le mode strict en premier lieu). Peut-être que c'est l'une de ces choses « aider les gens à tomber dans le gouffre du succès » ? Cela laisserait la fonctionnalité existante possible, mais pousserait le développeur dans la bonne voie.

D'accord, nous avons longtemps voulu le faire. Je pense qu'il est répertorié comme un élément 3.0 possible depuis longtemps. Mais le fait que la signature automagique à un argument soit stricte est certainement un petit pas dans cette direction.

En fait, j'ai commencé à coder le mode strict par défaut aujourd'hui en ajoutant une variable d'état globale à bascule appelée globalStrict, que j'ai définie par défaut sur true. Le réglage du mode strict peut ensuite être ramené à false en appelant :

moment.globalStrict(false)

Cela fait que tout se comporte comme d'habitude, sans avoir à changer chaque appel à l'analyseur de moment.
Il faut environ quatre lignes de code pour effectuer ce changement - et ensuite il faut corriger des centaines de tests unitaires :-)
Pour moi cependant, cela pourrait être un moyen de déployer strict par défaut sans avoir à attendre la v3.
J'ai l'impression que puisque les utilisateurs peuvent facilement le modifier, ils pourraient accepter le changement sans trop se plaindre.

Alternativement, le paramètre globalStrict peut être défini par défaut sur false, et nous pouvons fortement encourager les développeurs à le définir sur true dans la documentation. C'est moins invasif et peut-être utile?
Je serai la première personne à dire que les variables d'état globales SUCK du point de vue de la testabilité, et pour cette seule raison, cette idée pourrait être terrible.

Je pourrais également, comme suggéré, simplement appeler par défaut un argument en mode strict. Cela bouleversera probablement les milliers de personnes qui se replient toujours sur la construction de la date JS.

J'aime tout ça, sauf une chose :

Cela bouleversera probablement les milliers de personnes qui se replient toujours sur la construction de la date JS.

Pour être clair, ma suggestion n'était pas de mettre fin à l'obsolescence du constructeur JS. En fait, c'est le contraire : dans ce cas, nous voulons faire exactement cela mais le contrôle ISO nous préempte.

Alors, êtes-vous en train de dire que vous essaieriez le truc de l'état global, ou que vous l'éviteriez ? Peut-être que je vais juste finir les tests unitaires et faire le PR et nous pourrons en parler là-bas.

Désolé, je n'étais pas clair : je ne suis pas du tout contre l'état global. Je ne pense pas que cela nous empêche de rendre la vérification ISO de moment(string) stricte tout le temps, même sans l'état défini.

@maggiepint merci de
et vous avez correctement déclaré ci-dessus que j'étais "une de ces personnes là-bas":P faisant des choses comme
moment("2016-04-06Tnull").isValid()
en toute confiance, ce moment va rejeter une chaîne invalide.

Alors, quel est le moyen le plus simple d'activer l'analyse stricte par défaut ? (désolé, j'ai la flemme)

@Aukhan, nous n'avons jamais implémenté Global strict en raison d'un problème d'analyse en mode strict qui devait d'abord être corrigé. (mais c'était le cas, alors nous pouvons encore y arriver).

Pour accomplir ce que vous faites, je pense qu'il vous suffit de spécifier la constante ISO_8601 et le mode strict en ligne dans votre code :

moment("2016-04-06Tnull", moment.ISO_8601, true).isValid()
false

@maggiepint merci encore pour votre réponse ...

C'est une excellente suggestion, mais je ne voudrais pas remplacer des centaines de telles expressions où non seulement l'ISO_8601 mais différents formats personnalisés sont utilisés, donc je suppose que l'option globale stricte serait bien d'avoir.
J'ai commencé à regarder dans la base de code, mais évidemment un travail aussi énorme et génial ne peut être compris du jour au lendemain.

Je n'ai peut-être pas les compétences requises, mais si je peux aider de quelque façon que ce soit, faites-le moi savoir.
Merci !

@Aukhan Je vais voir si je ne peux pas reprendre cet élément de travail. Le problème est que pour que cela fonctionne, le PR #3078 doit être fusionné. C'est pourquoi la chose a été abandonnée en premier lieu.

Clôture en faveur du #3502

Cette page vous a été utile?
0 / 5 - 0 notes