"Попередження про депресацію: момент побудови повертається до дати 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.