1. ホーム
  2. javascript

[解決済み] javascriptのDateをJSONで文字列化し、タイムゾーンを保持する方法

2023-06-13 03:15:22

質問

私はユーザーによって作成される日付オブジェクトを持っていて、タイムゾーンはブラウザによって記入されます。

var date = new Date(2011, 05, 07, 04, 0, 0);
> Tue Jun 07 2011 04:00:00 GMT+1000 (E. Australia Standard Time)

しかし、文字列化すると、タイムゾーンが消えてしまいます。

JSON.stringify(date);
> "2011-06-06T18:00:00.000Z"

ブラウザのタイムゾーンを維持したままISO8601の文字列を取得する最善の方法は、moment.jsを利用して moment.format() を使用してコマンド全体をシリアライズする場合、もちろんそれはうまくいきません。 JSON.stringify を内部で使っているもの(この場合はAngularJS)を介してコマンド全体をシリアライズしている場合は、もちろんうまくいきません。

var command = { time: date, contents: 'foo' };
$http.post('/Notes/Add', command);

完全を期すために、私のドメイン はローカルタイムとオフセットの両方を必要とします。

どのように解決するのですか?

を含む何らかのオブジェクトがあると仮定します。 Date :

var o = { d : new Date() };

を上書きすることができます。 toJSON の関数をオーバーライドすることができます。 Date のプロトタイプを作成します。 ここでは、moment.js を使って moment オブジェクトを作成し、次にmomentの format 関数を使います。これはオフセットを含む ISO8601 拡張フォーマットを出力します。

Date.prototype.toJSON = function(){ return moment(this).format(); }

これで、オブジェクトをシリアライズしたときに、指定された日付の書式が使われるようになります。

var json = JSON.stringify(o);  //  '{"d":"2015-06-28T13:51:13-07:00"}'

もちろん、それは すべて Date オブジェクトを指定します。 特定の日付オブジェクトのみの動作を変更したい場合は、その特定のオブジェクトの toJSON 関数をこのようにオーバーライドします。

o.d.toJSON = function(){ return moment(this).format(); }