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.
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á.
Comentários muito úteis
@SystemParadox caso seja útil, tive um problema semelhante ao seu e acabei criando funções de wrapper como esta:
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 usarmomentStrict
emomentStrict.utc
vez demoment
emoment.utc
e o resto pode ficar do jeito que está.