1682


JavaScriptのDateオブジェクトの扱いについて質問します。
ブラウザ側からサーバにPOSTする時にデータをJSON化して送付することをと試みています。
しかし、JSON.stringify()メソッドにかけると【協定世界時（UTC）】に置き換えられてしまいます。

[code]

    var someDay = new Date(2014,12,2);
    console.log(someDay); --- > Wed Dec 03 2014 00:00:00 GMT+0900 (東京 (標準時))
    console.log(JSON.stringify(someDay)); --> "2014-12-02T15:00:00.000Z"
    
[/code]

サーバサイドでは、この挙動への対処を行いたくないので、ブラウザ側（JS側）で挙動に対する対処を行いたいと考えております。その際のベストプラクティスを教示頂けますと幸いです。


CC BY-SA 3.0
2014-12-16T05:41:58.890
1680
2014-12-16T06:56:13.510
3355
question
javascript
JavaScriptのDateオブジェクトに対して、JSON.stringify()メソッドに対するベストプラクティスを教えてください


タイムゾーン表記は処理系によってロケールに依存してしまい、上手く動かない場合もあります。 コンピュータの日付は 1970 年 1 月 1 日
00:00:00 UTC からの経過ミリ秒で管理出来ます。 この値さえあれば、どの時刻オフセットに対しても計算で Date
クラスに戻す事が出来ますし、おおよそそのプログラミング言語でも取り扱えます。JavaScript であれば `getTime()` で取得出来ます。

[code]

    var now = new Date();
    console.log(now); // Tue Dec 16 2014 14:50:56 GMT+0900 (東京 (標準時))
    var tm = now.getTime(); // 1418709056398
    
    now = new Date(tm);
    console.log(now); // Tue Dec 16 2014 14:50:56 GMT+0900 (東京 (標準時))
    
[/code]

JSONという表記に拘る必要はありません。どうしてもJSONという事であれば

[code]

    {
        "time": 1418709056398
    }
    
[/code]

の様に `getTime()` した値を保持するのが良いと思います。


CC BY-SA 3.0
2014-12-16T05:54:12.947
1682
2014-12-16T05:54:12.947
440
1680
answer


もしDateを何らかの文字列形式にしたいということであれば、[Moment.js](http://momentjs.com/)のformatを使うのが簡単です。

[code]

    moment(date).format('YYYY-MM-DD')
    
[/code]

で`2014-12-25`になります。詳細は[ドキュメント](http://momentjs.com/docs/#/displaying/)を見てください。


CC BY-SA 3.0
2014-12-16T06:04:39.597
1684
2014-12-16T06:04:39.597
450
1680
answer


JSON.stringify には[「toJSON メソッドがあれば toJSON()
の返す値を採用する」](https://developer.mozilla.org/ja/docs/JavaScript/Reference/Global_Objects/JSON/stringify#toJSON_behavior)
というものがあります。 これを活用すると、JSONにおける表現をピンポイントでカスタマイズすることができます。  
以下のように書くこともできるでしょう。

[code]

    var someDay = new Date(2014,12,2);
    
    // someData の toJSON メソッドを別のメソッドでオーバーライドしておく
    someDay.toJSON = Date.prototype.toGMTString;
    
    // JSON.stringify の結果が変化する
    console.log(JSON.stringify(someDay)); // "Thu, 01 Jan 2015 15:00:00 GMT"
    
[/code]

このやり方は Dateオブジェクトに限らず利用できます。


CC BY-SA 3.0
2014-12-16T06:12:50.147
1689
2014-12-16T06:12:50.147
2870
1680
answer


TimeZone safeでなくなるので、色々問題を含みますが、

[code]

    var someDay = new Date(); 
    someDay.setHours(someDay.getHours() - someDay.getTimezoneOffset() / 60);
    
    var someDayJSON = JSON.stringify(someDay);
    console.log(someDayJSON);
    
[/code]

こうすると、質問への直接的な解決方法になるかと思います。 ＃結果のJSONが末尾Zが付いているのに、UTCでない時刻が送信されることにご留意ください。


CC BY-SA 3.0
2014-12-16T06:56:13.510
1699
2014-12-16T06:56:13.510
3178
1680
answer