Предупреждение о устаревании: моментная конструкция возвращается к 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")._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
используется на ваш страх и риск в случае, если рекомендуемые/стандартные форматы не используются.
Чтобы подавить предупреждения об устаревании,
- Как подсказал @Joe Wilson в предыдущем ответе, укажите формат даты на
moment
построения.
Пример: moment("02.05.2018", "DD.MM.YYYY").format("DD MM YYYY");
- Дайте дату в формате ISO или RFC2822.
Пример: moment("2018-02-01T18:30:00.000Z")
- формат ISO
moment("Thu, 01 Feb 2018 18:30:00 GMT")
- RFC2822 Формат - Форматировать в Github
- Как предложено @niutech в предыдущем ответе, установите
moment.suppressDeprecationWarnings = true;
-
Я предлагаю перезаписать входной запасной момент в момент.
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/ для получения дополнительной информации. "