Moment: Analyser la valeur sans repli

Créé le 10 juil. 2015  ·  9Commentaires  ·  Source: moment/moment

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.

Enhancement

Commentaire le plus utile

@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.

Tous les 9 commentaires

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.

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