“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?


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.


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;


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.


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'}}

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.