Passer une valeur arbitraire à moment(value)
produit un avertissement de dépréciation selon #1407.
Ce serait vraiment bien s'il y avait un moyen d'utiliser cette analyse mais sans revenir au constructeur Date. Le seul moyen que j'ai trouvé jusqu'à présent est assez maladroit:
if (moment.isDate(value)) {
return moment(value);
} else {
return moment(value, moment.ISO_8601);
}
Et même dans ce cas, cela n'analyse toujours pas les chaînes ASP.net /Date(1198908717056)/
.
L'option la plus simple serait d'autoriser l'option stricte sous forme à deux arguments : moment(value, true)
.
Merci.
Juste pour clarifier, vous demandez un moyen de désactiver le repli plutôt que d'afficher l'avertissement - sans utiliser le mode strict, n'est-ce pas ?
Oui, je veux analyser automatiquement toutes les choses prises en charge par moment()
, mais si elles échouent toutes, au lieu d'imprimer un avertissement et d'utiliser le constructeur Date
, je veux qu'il produise une date invalide.
Je souhaite activer de manière préventive le comportement d'une future version de moment
, où le constructeur de secours obsolète Date
sera entièrement supprimé.
Je ne sais pas exactement ce que vous entendez par mode strict. Voulez-vous dire lors du passage du format exact comme moment(value, 'YYYY-MM-DD')
? Si c'est le cas, cela n'aide pas car 1. il est excessivement verbeux et 2. il n'inclut toujours pas tous les formats que moment(value)
peut analyser avant de recourir au constructeur Date
.
Le mode strict est activé en passant true
comme dernier paramètre. C'est dans la doc. Fondamentalement, cela signifie que la chaîne doit correspondre au format _exactement_.
Étant donné que les formats pris en charge directement par moment(String)
sont répertoriés dans la documentation, je pense qu'il serait acceptable de considérer cela comme le mode strict. En d'autres termes, en ajoutant moment(String, Boolean)
.
Oui ce serait super. Merci.
@SystemParadox oui, ce que vous voulez EST pris en charge. Vous venez de remplacer moment.createFromInputFallback(config)
:
moment.createFromInputFallback = function (config) {
config._d = new Date(NaN);
}
Je suis d'accord ce n'est pas anodin, mais c'est possible ;-)
C'est utile, mais change le paramètre globalement.
Que faire si je veux migrer progressivement une base de code un appel à la fois ?
Pourquoi ne pouvons-nous pas simplement ajouter un support pour moment(String, true)
?
La réouverture, bien qu'il existe une solution de contournement, l'avoir dans l'API publique aiderait une variété de cas d'utilisation. Considérez également #2535, demandant une validation autour uniquement des formats intégrés.
Ce qui est nécessaire, c'est la constante moment.JS_DATE, cela signifie simplement passer l'entrée à new Date
, vérifiez https://github.com/moment/moment/issues/1686. Accepter les demandes de tirage.
@SystemParadox au cas où cela
function disableNativeDateFallback(config) {
config._d = new Date(parseFloat('NaN')); // an invalid date
}
function makeMomentWrapper(momentFn) {
return function() {
var prevFallback = moment.createFromInputFallback;
moment.createFromInputFallback = disableNativeDateFallback;
var result = momentFn.apply(null, arguments);
moment.createFromInputFallback = prevFallback;
return result;
}
};
var momentStrict = makeMomentWrapper(moment);
momentStrict.utc = makeMomentWrapper(moment.utc);
Ils fonctionnent en remplaçant brièvement createFromInputFallback
, puis en le restaurant avant de revenir pour éviter d'affecter d'autres codes. Tout code que vous êtes prêt à migrer peut utiliser momentStrict
et momentStrict.utc
au lieu de moment
et moment.utc
et le reste peut rester tel quel.
Commentaire le plus utile
@SystemParadox au cas où cela
Ils fonctionnent en remplaçant brièvement
createFromInputFallback
, puis en le restaurant avant de revenir pour éviter d'affecter d'autres codes. Tout code que vous êtes prêt à migrer peut utilisermomentStrict
etmomentStrict.utc
au lieu demoment
etmoment.utc
et le reste peut rester tel quel.