“Aviso de descontinuação: a construção do momento volta para js Date” ao tentar converter a data RFC2822 em moment.js

164

Estou usando o código a seguir para converter uma data e hora do servidor em hora local usando moment.js.

 moment(moment('Wed, 23 Apr 2014 09:54:51 +0000').format('lll')).fromNow()

Mas estou recebendo:

Aviso de descontinuação: a construção do momento volta para js Data. Isso é desencorajado e será removido no próximo grande lançamento. Consulte https://github.com/moment/moment/issues/1407 para obter mais informações.

Parece que não consigo me livrar disso! Como posso corrigir isso?

dariush
fonte
você leu onde diz para fazer isso?
toesslab
7
Claro que eu li !! mas ou estou confuso e não consegui encontrar nenhuma solução ou não havia nenhuma solução lá!
dariush
Depois de ler um pouco lá, parece ser um problema real, que foi discutido meses atrás ... Tome uma outra ferramenta ...
toesslab

Respostas:

315

Para se livrar do aviso, você precisa:

  • Passe uma versão formatada ISO da sua sequência de datas:

    moment('2014-04-23T09:54:51');

  • Passe a string que você possui agora, mas diga a Moment em que formato ela está:

    moment('Wed, 23 Apr 2014 09:54:51 +0000', 'ddd, DD MMM YYYY HH:mm:ss ZZ');

  • Converta sua string em um objeto Data JavaScript e passe-o para Moment:

    moment(new Date('Wed, 23 Apr 2014 09:54:51 +0000'));

A última opção é um fallback interno que o Moment suporta por enquanto, com o aviso de console obsoleto. Eles dizem que não apoiarão esse fallback em versões futuras. Eles explicam que o uso new Date('my date')é imprevisível demais.

Joe Wilson
fonte
36
Qualquer um dos textos nos marcadores da resposta acima seria uma mensagem de aviso de depreciação muito melhor do que a mensagem confusa que iniciou essa pergunta.
Will
2
Está usando moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());ok? Ou estou apenas suprimindo um problema pronto para travar silenciosamente em um futuro próximo como este?
de Bruno Dedo
Você também pode receber esta mensagem se o valor passado contiver caracteres extras iniciais ou finais, como espaços. Geralmente acompanha um Invalidresultado de data.
Guillaume Renoult
@BrunoFinger que deve funcionar. Date () e toISOString () são itens de JavaScript, não de Moment.
21415 Joe
Se você não tiver escolha sobre como a data é fornecida, recomendo o segundo marcador, especificando o formato da String da data. Remove a maior ambiguidade.
21716 Joshua Pinter
50

Como alternativa, você pode suprimir a exibição do aviso de descontinuação definindo moment.suppressDeprecationWarnings = true;

niutech
fonte
Para o TypeScript, você pode precisar preceder isso com // @ts-ignore(pelo menos para algumas versões do fuso horário e @ tipos / fuso horário).
TrueWill
7

A construção da data em momentinternamente usa o new Date()no javascript. A new Date()construção reconhece a sequência de datas nos formatos RFC2822 ou ISO em todos os navegadores. Ao construir um momentobjeto com data que não esteja nesses formatos, o aviso de reprovação é emitido.

Embora os avisos de descontinuação sejam lançados, para alguns formatos, o momentobjeto será construído com êxito no Chrome, mas não no Firefox ou Safari. Por esse motivo, o processamento da data no Chrome pode gerar resultados conforme o esperado (nem sempre) e gerar Invalid Dateoutros.

Considere, 02.02.2018,

Chrome - moment("02.02.2018")._d->Fri Feb 02 2018 00:00:00 GMT+0530 (India Standard Time)

Firefox - moment("02.02.2018")._d->Invalid Date

Safari - moment("02.02.2018")._d->Invalid Date

Então o moment.js é usado por seu próprio risco, caso os formatos recomendados / padrão não sejam usados.

Para suprimir os avisos de descontinuação ,

  1. Como sugerido por Joe Wilson na resposta anterior, forneça o formato da data na momentconstrução.

Exemplo: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Forneça a data no formato ISO ou RFC2822.

Exemplo: moment("2018-02-01T18:30:00.000Z")- Formato ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT")- Formato RFC2822 - Formato no Github

  1. Conforme sugerido por @niutech na resposta anterior, defina

moment.suppressDeprecationWarnings = true;

  1. Sugiro substituir o fallback de entrada no momento.

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

Como (3) suprimirá todos os avisos, (4) suprimirá apenas o fallback da construção da data. Usando (4), você obterá Invalid Dateo uso interno new Date()e outras obsoletas poderão ser vistas no console, para que o momento possa ser atualizado ou os métodos obsoletos possam ser substituídos no aplicativo.

Vignesh Raja
fonte
3

Se sua data é passada para você a partir de uma API como string(como meu problema), você pode usar um filtro para converter a string em uma data por um momento. Isso resolverá o momento de aviso de construção.

$scope.apiDate = 10/29/2017 18:28:03";

angular.module('myApp').filter('stringToDate', function() {
  return function(value) {
     return Date.parse(value);
  };  
});

Adicione-o à visualização:

{{apiDate | stringToDate | amDateFormat:'ddd, MMM DD'}}
Fergus
fonte
0

Conforme indicado nas respostas acima. Fornecer o formato da data deve funcionar.

Por que eu estaria recebendo a mensagem de descontinuação com a seguinte linha de código. Eu pensei que o formato String + deveria resolver o problema. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Além disso, não tenho controle sobre o formato de data fornecido. Eu sei que posso convertê-lo para o 'YYYY-MM-DDTHH:mm:ss'momento em que não mostra a mensagem de descontinuação. No entanto, de acordo com a documentação, a linha de código deve funcionar. Aqui está a mensagem de reprovação que estou vendo.

"Aviso de descontinuação: o valor fornecido não está em um formato RFC2822 ou ISO reconhecido. A construção do momento volta para js Date (), que não é confiável em todos os navegadores e versões. Os formatos de data não RFC2822 / ISO são desencorajados e serão removidos em um próximo lançamento principal. Consulte http://momentjs.com/guides/#/warnings/js-date/ para obter mais informações. "

user2027058
fonte