「非推奨の警告:moment.jsでRFC2822日付を変換しようとすると、瞬間の構築がjs Dateにフォールバックする」


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 14

7
もちろん読んだ!! しかし、私は混乱していて解決策を取得できなかったか、まったく解決策がありませんでした!
dariush 14

そこで少し読んだ後、それは数ヶ月前に議論された実際の問題のようです...別のツールを
使って

回答:


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());[OK]を?または、私はこのように近い将来静かにクラッシュする準備ができている問題を抑制しているだけですか?
Bruno Finger

渡された値にスペースなどの先頭または末尾の余分な文字が含まれている場合にも、このメッセージが表示されることがあります。それは一般的にInvalid日付の結果と一緒に行きます。
Guillaume Renoult 2015年

動作するはずの@BrunoFinger。Date()とtoISOString()はJavaScriptのものであり、モーメントのものではありません。
Joe Wilson

日付を指定する方法を選択できない場合は、日付の文字列の形式を指定する2番目の箇条書きをお勧めします。最もあいまいさを取り除きます。
Joshua Pinter 2016

50

別の方法として、次のように設定することで、非推奨の警告の表示を抑制できます。 moment.suppressDeprecationWarnings = true;


TypeScriptの場合、これに先行する必要がある場合があります// @ts-ignore(少なくとも、一部のバージョンのmoment-timezoneと@ types / moment-timezone)。
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

string(私の問題のように)APIから日付が渡された場合、フィルターを使用して文字列を一時的な日付に変換できます。これにより、瞬間的な建設警告が処理されます。

$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

上記の回答に示されているように。日付フォーマットを提供することはうまくいくはずです。

次のコード行で非推奨メッセージが表示されるのはなぜですか。文字列+形式は問題を解決するためのものだと思いました。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/を参照して ください。 "

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.