«Предупреждение об устаревании: момент создания возвращается к js Date» при попытке преобразовать дату RFC2822 в moment.js

164

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

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

Но я получаю:

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

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

Дариуш
источник
Вы читали, где это говорит, чтобы сделать это?
toesslab
7
Конечно, я читаю! но либо я в замешательстве и не смог найти никакого решения, либо там вообще не было никакого решения!
Дариуш
Прочитав немного там, кажется, что это реальная проблема, которая обсуждалась несколько месяцев назад ... Возьмите другой инструмент ...
toesslab

Ответы:

315

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

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

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

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

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

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

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

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

Джо Уилсон
источник
36
Любой текст в пунктах вышеупомянутого ответа будет гораздо лучше предупреждать об устаревании, чем запутанный вопрос, с которого начался этот вопрос.
Уилл
2
Используете moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring());нормально? Или я просто подавляю проблему, готовую молча потерпеть крах в ближайшем будущем, как это?
Бруно Фингер
Вы также можете получить это сообщение, если переданное значение содержит начальные или конечные дополнительные символы, например пробелы. Это обычно идет с результатом Invalidдаты.
Гийом Рено
@ BrunoFinger, который должен работать. Date () и toISOString () - это JavaScript-вещи, а не Moment.
Джо Уилсон
Если у вас нет выбора, как указать дату, я бы порекомендовал второй пункт с указанием формата строки даты. Это устраняет большую неопределенность.
Джошуа Пинтер
50

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

niutech
источник
Для TypeScript вам, возможно, придется предшествовать этому // @ts-ignore(по крайней мере, для некоторых версий момент-часовой пояс и @ types / момент-часовой пояс).
TrueWill
7

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

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

Рассмотрим 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

Сафари - moment("02.02.2018")._d->Invalid 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()и другие устаревшие элементы будут видны в консоли, так что момент может быть обновлен или устаревшие методы могут быть заменены в приложении.

Виньеш Раджа
источник
3

Если ваша дата передается вам из 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'}}
Фергус
источник
0

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

Почему я получаю сообщение об устаревании со следующей строкой кода. Я думал, что формат 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/ для получения дополнительной информации. "

user2027058
источник