Moment: Analisar valor sem fallback

Criado em 10 jul. 2015  ·  9Comentários  ·  Fonte: moment/moment

Passar um valor arbitrário para moment(value) produz um aviso de depreciação de acordo com # 1407.

Seria muito bom se houvesse alguma maneira de usar essa análise, mas sem recorrer ao construtor Date. A única maneira que encontrei até agora é bastante desajeitada:

if (moment.isDate(value)) {
    return moment(value);
} else {
    return moment(value, moment.ISO_8601);
}

E mesmo assim, isso ainda não analisa strings ASP.net /Date(1198908717056)/ .

A opção mais simples seria permitir a opção estrita na forma de dois argumentos: moment(value, true) .

Obrigado.

Enhancement

Comentários muito úteis

@SystemParadox caso seja útil, tive um problema semelhante ao seu e acabei criando funções de wrapper como esta:

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);

Eles funcionam substituindo createFromInputFallback brevemente e, em seguida, restaurando-o antes de retornar para evitar afetar outro código. Qualquer código que você estiver pronto para migrar pode usar momentStrict e momentStrict.utc vez de moment e moment.utc e o resto pode ficar do jeito que está.

Todos 9 comentários

Só para esclarecer, você está pedindo uma maneira de desabilitar o fallback em vez de mostrar o aviso - sem usar o modo estrito, certo?

Sim, quero analisar automaticamente todas as coisas que moment() suporta, mas se todas falharem, em vez de imprimir um aviso e usar o construtor Date , quero produzir uma data inválida.

Desejo aderir preventivamente ao comportamento de uma versão futura de moment , em que o substituto do construtor Date obsoleto será totalmente removido.

Não sei exatamente o que você quer dizer com modo estrito. Você quer dizer ao passar o formato exato como moment(value, 'YYYY-MM-DD') ? Nesse caso, isso não ajuda porque 1. é proibitivamente prolixo e 2. ainda não inclui todos os formatos que moment(value) pode analisar antes de recorrer ao construtor Date .

O modo estrito é habilitado passando true como o último parâmetro. Está nos documentos. Basicamente, significa que a string deve corresponder ao formato _exatamente_.

Como os formatos suportados diretamente por moment(String) estão listados nos documentos, acho que seria aceitável considerar isso o mesmo que o modo estrito. Em outras palavras, adicionando moment(String, Boolean) .

Sim, isso seria ótimo. Obrigado.

@SystemParadox sim, o que você deseja é suportado. Você acabou de substituir moment.createFromInputFallback(config) :

moment.createFromInputFallback = function (config) {
    config._d = new Date(NaN);
}

Concordo que não é trivial, mas é possível ;-)

Isso é útil, mas muda a configuração globalmente.

E se eu quiser migrar progressivamente uma base de código, uma chamada por vez?

Por que não podemos apenas adicionar suporte para moment(String, true) ?

Reabrir, embora haja uma solução alternativa, ter isso na API pública ajudaria em uma variedade de casos de uso. Considere também o # 2535, pedindo validação em torno apenas dos formatos integrados.

O que é necessário é a constante moment.JS_DATE, ou seja, basta passar a entrada para new Date , verificar https://github.com/moment/moment/issues/1686. Aceitando solicitações pull.

@SystemParadox caso seja útil, tive um problema semelhante ao seu e acabei criando funções de wrapper como esta:

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);

Eles funcionam substituindo createFromInputFallback brevemente e, em seguida, restaurando-o antes de retornar para evitar afetar outro código. Qualquer código que você estiver pronto para migrar pode usar momentStrict e momentStrict.utc vez de moment e moment.utc e o resto pode ficar do jeito que está.

Esta página foi útil?
0 / 5 - 0 avaliações