2016-03-01 13 views
7

datepickerを使用して日付を選択し、サーバーに送信します。角度のある素材の日付ピッカーの日付が間違っています

私はJSの値をログに記録するとき、私は正しい結果を得る:

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

が、Ajaxのリクエストで、それは私がちょうどにオブジェクトを与えて、値を変更しないでください

2016-03-21T23:00:00.000Z 

です角度HTTP関数。

Angularはそれを処理するための設定が必要ですか?

+0

md-date-pickerにng-model-options = "{timezone: 'utc'}"を追加すると良い解決策が見つかりました。 – Brendan

答えて

3

これらの2つの文字列は同じ時刻を表します。 1つはUTC(すなわちGMT +0)で、これはZの末尾に表示されます。もう1つは異なるタイムゾーン、具体的にはGMT + 1時間です。

両方の文字列のjavascriptの日付オブジェクトを整数に変換すると、1970年1月1日から経過した秒数が同じであることがわかります。それらは同一の即時を表すが、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で対処するのが最善の方法です。

+0

しかし、gmt + 1形式をサーバーに送信するにはどうすればよいですか? – mimo

+1

私はあなたが試みていないことを強くお勧めします。サーバーはUTCを格納し、UTCをブラウザに送り返すことができます。 Javascriptでは、UTC時刻から 'Date'オブジェクトを作成できます。何もせずに、ユーザーにはローカライズされたタイムゾーンが表示されます。サーバーにタイムゾーン固有のタイムゾーンを保存する必要がある場合は、 '.toString()'メソッドを呼び出すことによって値を文字列にすることができます。 – Chris

3

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

1.1.1+バージョンをチェックしてください。これはあなたの問題を解決します。

<md-datepicker ng-model="date" ng-model-options="{ timezone: 'utc' }"></md-datepicker> 
+0

私は角度2(+)とマット - 日付ピッカーで同じことを実行したいと思います。前もって感謝します!! –

2

あなたは、コード

date.setMinutes((date.getTimezoneOffset() * -1)); 

ローカライズの必要がありません、次の作品を試すだけで任意のサービス呼び出しを実行する前にこのコードを使用することができます。それはあなたにdatepickerであなたが選んだ正確な日付を渡します。 ( - )

それはすべてのタイムゾーン(+)とで動作する、

例:2016-03-21 00:00:00 GMT+0100、上記のコードは2016-03-21 01:00:00 GMT+0000としてひそか装置しました。サービス中は2016-03-21 00:00:00に変換されます。

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

関連する問題