web-dev-qa-db-ja.com

angularマテリアルの日付ピッカーで間違った日付

日付ピッカーを使用して日付を選択し、サーバーに送信します。

JS値をログに記録すると、正しい結果が得られます。

Tue Mar 22 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit)

しかし、ajaxリクエストではそれは

2016-03-21T23:00:00.000Z

値を変更するのではなく、オブジェクトにangulars http関数を与えるだけです。

Angularそれを処理するためにいくつかの設定が必要ですか?

12
cre8

これら2つの文字列は同じ時間を表します。 1つはUTC、つまりGMT +0であり、Zの末尾から確認できます。もう1つは異なるタイムゾーン、具体的にはGMT +1時間です。

両方の文字列のJavaScript日付オブジェクトがあり、それらを整数に変換した場合、つまり1970年1月1日からの経過秒数(UTC)の場合、それらは同一であることがわかります。それらは同じインスタントを表しますが、2つの異なる地理的位置で表します。

var d1 = new Date('Tue Mar 22 2016 00:00:00 GMT+0100');
var d2 = new Date('2016-03-21T23:00:00.000Z');

Number(d1);  // 1458601200000
Number(d2);  // 1458601200000

一般的にこれは良いことです。タイムゾーンの扱いは非常に混乱します。サーバーが常にUTCで処理するのが最善の方法です。

6
Chris

次のコードを試すことができます

dateObj.setMinutes((dateObj.getMinutes() + dateObj.getTimezoneOffset()));

ローカリゼーションの必要はありません。サービス呼び出しを行う直前にこのコードを使用してください。日付ピッカーで選択した正確な日付が渡されます。

すべてのタイムゾーン(+)と(-)で機能します。

例:2016-03-21 00:00:00 GMT+0100、上記のコードはそれを2016-03-21 01:00:00 GMT+0000に変換します。サービス中は、2016-03-21 00:00:00に変換します。

それはあなたの問題を解決すると思います。

7

https://github.com/angular/material/pull/941

1.1.1+バージョンをチェックしてください。これで問題が解決します。

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker>
4
Kunal Panchal

Tue Aug 06 2019 00:00:00 GMT+0530 (India Standard Time)のような日付を選択するとします。
午前2019-08-05T18:30:00.000Z。 (私の場合、選択した日付に関して以前の日付)
私は toLocalDateString() を使用して仕事をしました。

    // this.date = 2019-08-05T18:30:00.000Z
    const converted = new Date(this.date).toLocaleDateString(); 
    console.log(converted); // 8/6/2019 (MM/DD/YYYY) format
1
guru_007