RubyでTimeオブジェクトをto_json
をした場合、次のような形になります。
JSON
1["2016-06-26 00:00:00 +0900","2016-06-25 15:00:00 UTC"]
二つはタイムゾーンが異なるだけで、全く同じ日時です。この二番目の文字列をmoment.jsを使ってパースしようとしたときに、うまくいきません。
JavaScript
1var t = "2016-06-25 15:00:00 UTC"; 2new Date(t); // Sun Jun 26 2016 00:00:00 GMT+0900 3 4moment(t); // Sat Jun 25 2016 15:00:00 GMT+0900 5moment(t, 'YYYY-MM-DD HH:mm:ss Z'); // Sat Jun 25 2016 15:00:00 GMT+0900
new Date()
ではゾーンの情報(UTCの部分)も見てくれます。しかし、momemnt()
では、そのまま渡した場合も、ゾーン情報ありとしてフォーマットを指定した場合もゾーン情報が無視されて、9時間前になってしまいます。
そこで、下記のようにすることで、なんとかゾーンを見てくれるようになりました。
JavaScript
1moment(new Date(t)); // Sun Jun 26 2016 00:00:00 GMT+0900 2moment(t.replace('UTC', '+0000'), 'YYYY-MM-DD HH:mm:ss Z'); // Sun Jun 26 2016 00:00:00 GMT+0900
一旦new Date()
でパースさせてしまうか、ゾーンを"±hhmm"の形にしてしまうと、一応はうまくいきます。
###聞きたいこと
上二つの解決方法のいずれも、一旦Dateにするとか、文字列を置換するとか、余計とも思えるような処理が入っており、しっくりきません。moment.jsで"UTC"を直接読めるような方法が本当はあるのではないかと思っているのですが、そのような方法は無いのでしょうか?
###その他の情報
JSONを出している側はRubyのSinatraで作成しています。直接Timeオブジェクトが含まれるHashやArrayをto_json
する場合と、mongodbから取得したBSONオブジェクトをto_json
する場合があります。Timeオブジェクトは"+0900'に統一できているのですが、BSONはタイムゾーン情報が無いためか常に"UTC"になります。このため、JSONを出している側で調整は難しいと考えています。
作成中のWebアプリは利用者が非常に限定(2〜3人ぐらい)されているため、ブラウザはGoogle Chromeのみターゲットにしています。Google Chromeで動作すれば、ブラウザを選ぶような解決方法でもかまいません。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/06/29 10:31 編集