«Предупреждение об устаревании: момент создания возвращается к 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;


Для 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/ для получения дополнительной информации. "

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.