Предупреждение о устаревании: моментная конструкция возвращается к js Date

Я использую следующий код для преобразования времени на стороне сервера в локальное время, используя Moment.js

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

Но я получаю:

Предупреждение о устаревании: моментная конструкция возвращается к js Date. Это обескураживает и будет удалено в предстоящем крупном выпуске. Дополнительную информацию см. на странице https://github.com/moment/moment/issues/1407.

Кажется, я не могу избавиться от этого! Как я могу это исправить?

Ответ 1

Чтобы избавиться от предупреждения, вам нужно либо:

  • Перейдите в форматированную в формате ISO строку даты:

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

  • Перейдите в строку, которая у вас есть, но сообщите Moment, в каком формате находится строка:

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

  • Преобразуйте свою строку в объект Date JavaScript и передайте ее в Moment:

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

Последний вариант - это встроенный резерв, который поддерживает Moment на данный момент, с предупреждением об устаревших консолях. Говорят, что они не поддержат этот резерв в будущих выпусках. Они объясняют, что использование new Date('my date') слишком непредсказуемо.

Ответ 2

В качестве альтернативы вы можете подавить показ предупреждения об устаревании, установив moment.suppressDeprecationWarnings = true;

Ответ 3

Построение даты в moment внутренне использует new Date() в JavaScript. new Date() распознает строку даты в формате RFC2822 или ISO во всех браузерах. При создании объекта moment с датой не в этих форматах выдается предупреждение об устаревании.

Хотя предупреждения устаревания выбрасывается, для некоторых форматов, то moment объект будет успешно построен в Chrome, но не в Firefox или Safari. Из-за этого обработка даты в Chrome может дать ожидаемые результаты (не всегда) и привести к Invalid Date в других.

Рассмотрим 02.02.2018 г.

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

Firefox - moment("02.02.2018")._dInvalid Date

Safari - moment("02.02.2018")._dInvalid Date

Поэтому moment.js используется на ваш страх и риск в случае, если рекомендуемые/стандартные форматы не используются.

Чтобы подавить предупреждения об устаревании,

  1. Как подсказал @Joe Wilson в предыдущем ответе, укажите формат даты на moment построения.

Пример: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");

  1. Дайте дату в формате ISO или RFC2822.

Пример: moment("2018-02-01T18:30:00.000Z") - формат ISO

moment("Thu, 01 Feb 2018 18:30:00 GMT") - RFC2822 Формат - Форматировать в Github

  1. Как предложено @niutech в предыдущем ответе, установите

moment.suppressDeprecationWarnings = true;

  1. Я предлагаю перезаписать входной запасной момент в момент.

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

Поскольку (3) будет подавлять все предупреждения, (4) будет подавлять только запасной вариант построения даты. Используя (4), вы получите Invalid Date поскольку используется внутренняя new Date() а в консоли можно увидеть другие устаревшие версии, поэтому момент можно обновить или заменить устаревшие методы в приложении.

Ответ 4

Если ваша дата передана вам от API как string (например, моя проблема), вы можете использовать фильтр для преобразования строки в дату на мгновение. Это позаботится о моменте предупреждения о строительстве.

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

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

Добавьте его в представление:

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

Ответ 5

Как указано в ответах выше. Предоставление формата даты должно работать.

Почему я получаю сообщение об устаревании со следующей строкой кода. Я думал, что формат String + должен был решить проблему. moment.tz('2015:08:20 14:33:20', 'YYYY:MM:DD HH:mm:ss', 'America/New_York'). Кроме того, пожалуйста, не контролируйте формат даты. Я знаю, что могу сам преобразовать его в 'YYYY-MM-DDTHH:mm:ss' тогда момент не показывает сообщение об устаревании. Однако, согласно документации, строка кода должна работать. Вот сообщение об устаревании, которое я вижу.

"Предупреждение об устаревании: предоставленное значение не соответствует распознанному формату RFC2822 или ISO. Конструкция момента возвращается к js Date(), которая не надежна во всех браузерах и версиях. Неформатные форматы даты RFC2822/ISO не рекомендуется и будут удалены Предстоящий основной выпуск. Пожалуйста, обратитесь к http://momentjs.com/guides/#/warnings/js-date/ для получения дополнительной информации. "