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

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

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

Но я получаю:

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

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


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


Ответы (7)


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

  • Передайте версию строки даты в формате 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');

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

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

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

person Joe Wilson    schedule 29.04.2014
comment
Любой текст в маркерах в приведенном выше ответе будет намного лучше, чем сообщение, которое сбивает с толку, с которого начинается этот вопрос. - person Will; 23.08.2015
comment
Использует moment((new Date('Thursday, November 12, 2015 11:59 PM').toISOSring()); нормально? Или я просто подавляю проблему, готовую тихо вылететь в ближайшем будущем, вот так? - person Bruno Finger; 12.11.2015
comment
Вы также можете получить это сообщение, если переданное значение содержит начальные или конечные дополнительные символы, например пробелы. Обычно это результат Invalid даты. - person Guillaume Renoult; 16.11.2015
comment
@BrunoFinger, который должен работать. Date () и toISOString () относятся к JavaScript, а не к моменту. - person Joe Wilson; 16.11.2015
comment
Если у вас нет выбора, как предоставляется дата, я бы порекомендовал второй маркер, определяющий формат строки даты. Он устраняет большую часть двусмысленности. - person Joshua Pinter; 22.02.2016
comment
У меня такая же проблема с моим моментом кода (Date ()). Format ('YYYY-MM-DD-HH-mm-ss'), и я получаю такое же предупреждение, как я могу изменить свой код, чтобы получить текущую дату для данного формата? - person Vivek Panday; 20.03.2017
comment
@VivekPanday Вы можете просто использовать moment().format('YYYY-MM-DD-HH-mm-ss'), поскольку аргумент конструктора по умолчанию - текущая дата и время. - person rink.attendant.6; 09.08.2017
comment
как правильно отключить предупреждение? - person Buffalo; 09.11.2017

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

person niutech    schedule 25.09.2017
comment
Для TypeScript вам, возможно, придется перед этим указать // @ts-ignore (по крайней мере, для некоторых версий момент-часовой пояс и @ types / moment-timezone). - person TrueWill; 12.02.2020

Конструкция даты в 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

Safari - 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(), а в консоли можно увидеть другие устаревшие методы, поэтому можно обновить момент или заменить устаревшие методы в приложении.

person Vignesh Raja    schedule 17.07.2018

Если ваша дата передается вам из 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'}}
person Fergus    schedule 30.10.2017

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

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

person user2027058    schedule 11.04.2019

В моем случае я пытался сгенерировать дату и время для включения в мои данные формы. Но формат строки, к которой у меня был доступ, выглядел как 10-сен-2020 10:10, поэтому при попытке использовать момент вроде

myDate = '10-Sep-2020 10:10';

moment(myDate).format('YYYY-MM-DD HH:mm:ss');

Я получил предупреждение об устаревании. Нет проблем с использованием строки для создания даты, но вам просто нужно дать моменту знать, что вы передаете. Как и в явном виде, укажите формат, который он собирается получить, например

moment(myDate, 'DD-MMM-YYYY HH:mm').format('YYYY-MM-DD HH:mm:ss');

результат: 2020-09-10 10:10:00 Вот и все, предупреждение исчезает, момент счастлив, и у вас есть формат даты и времени, готовый для сохранения.

person david    schedule 17.09.2020
comment
При ответе на старый вопрос, имеющий принятый ответ (ищите зеленый ✓), а также на другие ответы, убедитесь, что ваш ответ добавляет что-то новое или иным образом полезен по отношению к ним. Таким образом, в принятом ответе Джо Уилсона говорится: Передайте строку, которая у вас есть сейчас, но сообщите момент в каком формате строка находится ‹пример кода› в основном уже дает тот же ответ. - person Ivo Mori; 18.09.2020

Использование Moment настолько распространено, что со временем отказаться от текущей версии невозможно. Ознакомьтесь с этим сообщением об альтернативных вариантах перехода с moment.js

person Panayiotis Georgiou    schedule 25.01.2021