web-dev-qa-db-ja.com

非推奨の警告:モーメント構築は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 を参照してください。

私はそれを取り除くことができないようです!どうすれば修正できますか?

146
dariush

警告を取り除くには、次のいずれかが必要です。

  • 日付文字列の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')を使用することはあまりにも予測不可能であると説明しています。

280
Joe Wilson

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

32
niutech

momentの日付構成は、javascriptのnew Date()を内部的に使用します。 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)を使用すると、内部のnew Date()が使用され、他の非推奨がコンソールに表示されるため、Invalid Dateが得られるので、アプリケーションでモーメントをアップグレードしたり、非推奨のメソッドを置き換えたりできます。

5
Vignesh Raja

日付が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'}}
2
Fergus

上記の回答に示されているとおり。日付形式の提供は機能するはずです。

次のコード行で非推奨メッセージを受け取るのはなぜですか。文字列+形式が問題を改善すると考えられていました。 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/ を参照してください。

0
user2027058