"Попередження про депресацію: момент побудови повертається до дати js" при спробі перетворити дату RFC2822 в момент.js


164

Я використовую такий код, щоб перетворити дату часу на стороні сервера в місцевий час за допомогою moment.js.

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

Але я отримую:

Попередження про припинення роботи: момент побудови повертається до js Date. Це не рекомендується та буде видалено в майбутньому великому випуску. Будь ласка, зверніться до https://github.com/moment/moment/isissue/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, а потім передайте його в момент:

    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, а не моменти.
— Джо Вілсон

Якщо у вас немає вибору щодо того, як вказати дату, я рекомендую другу точку позначення, вказавши формат рядка дати. Це знімає найбільш неоднозначність.
— Джошуа Пінтер

50

Як альтернативу, ви можете придушити показ попередження про анулювання, встановивши його moment.suppressDeprecationWarnings = true;


Для TypeScript вам, можливо, доведеться передувати цьому // @ts-ignore(принаймні, для деяких версій момент-часового поясу та @ типів / момент-часовий пояс).
— 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 Format - Формат у 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.