Aviso de descontinuação no Moment.js - Não está no formato ISO reconhecido

176

Estou recebendo um aviso de que um valor fornecido no momento não está em um formato ISO reconhecido. Mudei minha variável hoje com a função moment e ainda não funciona.

Aqui está o erro de aviso:

Aviso de descontinuação: o valor fornecido não está em um formato 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 ISO são desencorajados e serão removidos em um próximo grande lançamento. Consulte http://momentjs.com/guides/#/warnings/js-date/ para obter mais informações. Argumentos: [0] _isAMomentObject: true, _isUTC: true, _useUTC: true, _l: indefinido, _i: 26-09-2016 19:30, _f: indefinido, _strict: undefined, _locale: [objeto Objeto]

var entryDate = new Date();
var currentDate = entryDate.getDate();

function between(x, min, max) {
  return x.valueOf() >= min.valueOf() && x < max.valueOf();
}

$('#custom1').change(function () {
  if ($('#custom1 :selected').val() == 'AU') {
    var keyword = '';

    var aus1_s = moment.tz('2016-9-26 19:30', 'Australia/Sydney');
    var aus2_s = moment.tz('2016-10-2 19:30', 'Australia/Sydney');
    var aus3_s = moment.tz('2016-10-9 19:30', 'Australia/Sydney');
    var aus4_s = moment.tz('2016-10-16 19:30', 'Australia/Sydney');
    var aus5_s = moment.tz('2016-10-23 19:30', 'Australia/Sydney');
    var aus6_s = moment.tz('2016-10-30 19:30', 'Australia/Sydney');
    var aus6_e = moment.tz('2016-11-5 19:30', 'Australia/Sydney');
  } else if ($('#custom1 :selected').val() == 'NZ') {
    var aus1_s = moment.tz('2016-9-28 20:30', 'Pacific/Auckland');
    var aus2_s = moment.tz('2016-10-4 20:30', 'Pacific/Auckland');
    var aus3_s = moment.tz('2016-10-11 20:30', 'Pacific/Auckland');
    var aus4_s = moment.tz('2016-10-18 20:30', 'Pacific/Auckland');
    var aus5_s = moment.tz('2016-10-25 20:30', 'Pacific/Auckland');
    var aus6_s = moment.tz('2016-11-2 20:30', 'Pacific/Auckland');
    var aus6_e = moment.tz('2016-11-9 20:30', 'Pacific/Auckland');
  } else {
    $('#entryEquals').val('');
    return false;
  }

  var today = moment();

  switch (true) {
    case between(today, aus1_s, aus2_s):
      keyword = 'RElYT04=';
      break;

    case between(today, aus2_s, aus3_s):
      keyword = 'QlJJREU=';
      break;

    case between(today, aus3_s, aus4_s):
      keyword = 'U1lETkVZ';
      break;

    case between(today, aus4_s, aus5_s):
      keyword = 'R1JPT00=';
      break;

    case between(today, aus5_s, aus6_s):
      keyword = 'V0VERElORw==';
      break;

    case between(today, aus6_s, aus6_e):
      keyword = 'VExD';
      break;

    default:
      $('#entryEquals').val('');
      break;
  }

  $('#entryEquals').val(keyword);
});
Jemai
fonte
1
Eu acho que o aviso se refere a '2016-9-26 19:30'e tal não ser um formato ISO reconhecido
Jaromanda X
qual é o erro no formato? então eu preciso adicionar 0?
Jemai 11/10
1
Você pode fazer moment.tz('2016-9-28 20:30', 'YYYY-M-D H:mm', 'Pacific/Auckland');de acordo com a documentação ... isto vai aceitar 1 ou 2 meses e dias dígito, 1 ou 2 horas dígitos em formato de 24 horas
Jaromanda X
2
O erro é que o formato que você está fornecendo não é um formato ISO reconhecido ... quer fornecer um formato ISO reconhecido, ou fornecer uma string que "dicas" no formato esperado
Jaromanda X
Ok, obrigado, que tal este também posso adicionar este formato? var today = moment.tz (cadeia de hoje, $. urlParam ('t_zone'));
Jemai 11/10

Respostas:

180

Confira toda a documentação incrível!

Aqui é onde eles discutem a mensagem de aviso .

String + Formato

Aviso: O suporte do navegador para analisar seqüências de caracteres é inconsistente. Como não há especificação sobre quais formatos devem ser suportados, o que funciona em alguns navegadores não funcionará em outros navegadores.

Para resultados consistentes analisando qualquer coisa que não seja ISO 8601, você deve usar String + Format .

moment("12-25-1995", "MM-DD-YYYY");

String + Formatos (vários formatos)

Se você tiver mais de um formato, consulte os formatos String + (com um 's').

Se você não conhece o formato exato de uma sequência de entrada, mas sabe que pode ser um dos muitos, pode usar uma variedade de formatos.

moment("12-25-1995", ["MM-DD-YYYY", "YYYY-MM-DD"]);

Verifique a documentação para algo mais específico.

Fuso horário

Análise de checkout na zona , a documentação equivalente para fusos horários.

O construtor moment.tz usa todos os mesmos argumentos que o construtor de momento, mas usa o último argumento como um identificador de fuso horário.

var b = moment.tz("May 12th 2014 8PM", "MMM Do YYYY hA", "America/Toronto");

EDITAR

//...
var dateFormat = "YYYY-M-D H:m"; //<-------- This part will get rid of the warning.
var aus1_s, aus2_s, aus3_s, aus4_s, aus5_s, aus6_s, aus6_e;
if ($("#custom1 :selected").val() == "AU" ) {
    var region = 'Australia/Sydney';

    aus1_s = moment.tz('2016-9-26 19:30', dateFormat, region);              
    aus2_s = moment.tz('2016-10-2 19:30', dateFormat, region);              
    aus3_s = moment.tz('2016-10-9 19:30', dateFormat, region);                  
    aus4_s = moment.tz('2016-10-16 19:30', dateFormat, region);                 
    aus5_s = moment.tz('2016-10-23 19:30', dateFormat, region);
    aus6_s = moment.tz('2016-10-30 19:30', dateFormat, region);
    aus6_e = moment.tz('2016-11-5 19:30', dateFormat, region);
} else if ($("#custom1 :selected").val() == "NZ" ) {
    var region = 'Pacific/Auckland';

    aus1_s =  moment.tz('2016-9-28 20:30', dateFormat, region);
    aus2_s =  moment.tz('2016-10-4 20:30', dateFormat, region);
    aus3_s =  moment.tz('2016-10-11 20:30', dateFormat, region);
    aus4_s =  moment.tz('2016-10-18 20:30', dateFormat, region);
    aus5_s =  moment.tz('2016-10-25 20:30', dateFormat, region);
    aus6_s =  moment.tz('2016-11-2 20:30', dateFormat, region);
    aus6_e =  moment.tz('2016-11-9 20:30', dateFormat, region);
}
//...
christo8989
fonte
89
Em vez de copiar e colar a documentação, forneça uma resposta real.
Rebs
2
foi isso que me ajudou a colocar o formato em "entrada" - momento ("12-25-1995", ["MM-DD-AAAA", "AAAA-MM-DD"]);
precisa saber é o seguinte
2
@ Rebs Acho que adicionei muita documentação porque a solução geral não é direta. Obviamente, a solução específica para Jemai deveria estar na resposta e a adicionei desde então (graças a você!), Mas a primeira é por que há tanta documentação aqui.
Christo8989
Obrigado, e se você quiser apenas uma data simples sem essa estrutura de formatação pesada, podemos ignorar esse aviso, talvez?
Webwoman
isso me ajudou -> momento ("12-25-1995", ["MM-DD-AAAA", "AAAA-MM-DD"]);
Cesar Rodriguez T
50

Fazer isso funciona para mim:

moment(new Date("27/04/2016")).format
Jigar Bhatt
fonte
5
Este é o mais simples em torno do trabalho para evitar a poluição do console
Josey
2
Eu não recomendaria essa abordagem a ninguém que tenha que lidar com o suporte do IE em qualquer grau. Os resultados são muito esquisito especialmente no IE 11.
Ajm113
1
Essa é a resposta mais simples e precisa. Obrigado, isso me ajudou.
Tahir Afridi
15

Eu encontrei esse erro porque estava tentando passar uma data de localStorage. Passar a data para um novo Dateobjeto e chamar .toISOString () fez o truque para mim:

const dateFromStorage = localStorage.getItem('someDate');
const date = new Date(dateFromStorage);
const momentDate = moment(date.toISOString());

Isso suprimiu todos os avisos no console.

Shahzeb Khan
fonte
Isso suprimirá o aviso, mas a desvantagem é se você é específico do fuso horário, então eu não sugeriria isso: porque ele converteria a data especificada em UTC, como dizemos '.toISOString ()'. Tente "momento (new Date (" 27/04/2016 ")) formato.", Como declarou de outra resposta - que iria manter o tempo em locais ..
whoami
15

use momento em sua função como esta

 moment(new Date(date)).format('MM/DD/YYYY')
MD. ABU TALHA
fonte
Esta é a resposta curta que você está procurando se você quer apenas se livrar do "aviso depreciados"
VictorC
6

Esta resposta é para entender melhor este aviso

O aviso de descontinuação é causado quando você usa o momento para criar um objeto de tempo var today = moment();,.

Se este aviso estiver correto, então eu tenho um método mais simples.

Não use dateobjeto de jsuso em momentvez disso. Por exemplo, use moment()para obter a data atual.

Ou converta o jsobjeto de momentdata em data. Você pode simplesmente fazer isso especificando o formato do seu jsobjeto de data.

ou seja, moment("js date", "js date format");

por exemplo:

moment("2014 04 25", "YYYY MM DD");

(MAS VOCÊ PODE UTILIZAR SOMENTE ESTE MÉTODO ATÉ QUE DEPRECIATE, isso poderá ser depreciado momentno futuro)

Saahithyan Vigneswaran
fonte
6
Seriamente! a pergunta sobre como remover esse aviso de descontinuação! sem perguntar como usar essa depreciação! além disso, é "isso será removido no futuro" e não "isso pode ser depreciado a partir do momento no futuro" já está obsoleto!
Al-Mothafar
@ Al-Mothafar, tenho uma pequena dúvida, por que você foi além quando a ifcondição falhou. Você deve sair da resposta para não prosseguir.
Saahithyan Vigneswaran
2
Obrigado, esta é a resposta que realmente me mostrou o que posso saber aqui.
DigitalDesignDj
3

Você pode usar

moment(date,"currentFormat").format("requiredFormat");

Isso deve ser usado quando a data não estiver no formato ISO, pois mostrará em momento qual é o nosso formato atual.

BeaST 30
fonte
1
Embora esse código possa responder à pergunta, fornecer um contexto adicional sobre como e / ou por que resolve o problema melhoraria o valor a longo prazo da resposta.
leopal 15/01
@leopal fez algumas mudanças!
BeaST 30 de
2

Analisando sequência com moment.js.

const date = '1231231231231' //Example String date
const parsed = moment(+date);
Коля Ракета
fonte
Isso me ajudou a me livrar do aviso de descontinuação quando estava tentando usar o formato unix para obter o número da semana.
usar o seguinte