Webアプリケーションを開発する際には、日本のサーバで日本人に対して日本語でサービスを提供するのであれど時差の問題について一考されたい。Webアプリケーションでは、ユーザーが10時と入力すればユーザーの意図通りサーバに10時という時刻が確実に伝わり、そうデータベースに記録されたし、データベースに10時と記録されていればユーザーにも10時と表示されるのが当たり前だった。全ての処理をサーバ本位で行っていたため時差が問題になることはなかった。JavaScriptがユーザーとの対話を行う場合はどうだろう。サーバのタイムゾーンと、クライアントたるWebブラウザのタイムゾーンは違う可能性がある。以前はサーバ本位で処理が行われていたため考えなくても良かったことだが、Webブラウザの地位が拡大し処理の一部がクライアント側で行われるようになったことで、クライアントとサーバの間に存在する地理的な距離が時差となって現れ問題になる。要するに時差を考慮しないAjaxアプリケーションでは、ユーザーが(フォームなどで)入力した日付時刻の情報がサーバには時差分ズレて伝わる、またはその逆でサーバのデータベースに格納されている日付時刻情報がユーザーの画面ではズレて表示されてしまうということだ。実際にはズレているわけではなくUTC(世界標準時)に直せば同じ時刻を示しているわけだが、かならずしもそれはユーザーの意図する結果を反映するわけではない。日本国内向けのサービスであれば国内に時差などないのでほとんどの場合この問題は起こらないが、日本人全てが日本にいるというわけでもない。シンガポール在住の日本人一家が週末日本に帰省する予定を立てていて、「日本時間の」18時のつもりでサイトからレストランの予約をしたところ日本にあるレストラン側のデータベース上には19時と登録されてしまう、といったことになるかもしれない。ユーザーがシンガポールに居れば、ブラウザ上のJavaScriptもシンガポール時間でDateオブジェクトの処理をする。ところがユーザーは日本のレストランのサイトを日本語で閲覧しているのだから、当然予約の日時も日本時間のつもりで入力している。予約データが日本のサーバに送信される際には(一旦UTCを経由して)日本時間に変換される。これがサーバとクライアントの間で時差がある時にユーザーの意図と違う時刻がサーバに記録されてしまうからくりだ。相手の居場所がシンガポールなら1時間のズレで済むが、もっと遠いところにも日本人は住んでいるし、進む国際化で海外に住む日本人の数は将来増えはすれど減ることはないだろうから、マイナーケースとしてただ放っておくというのも気が引ける話である。「日本人ならどこの国に居てもタイムゾーンを日本に設定していろ」っていうのも横暴な話だ。JavaScriptのDate型と同じ)。これについての議論を日本語でそれほど見かけない所をみると、国内で時差のあるアメリカ等と違って日本では問題の存在自体にほとんど気付かれていないのではないかと思う。ような)で時間を表現すれば解決する。Date型を使うこと自体をやめるのは賢明とは言いがたい。いえ通信するたびにいちいち文字列や数値の配列との相互変換を記述するというのは避けられるなら避けたいので透過的な変換を模索することになる。JSONシリアライザ・デシリアライザがそれぞれどういうもので、どうカスタマイズ出来るかという個別の話になるだろう。8601のような文字列表現で代用する。シリアライズ・デシリアライズ時には多くの場合UTCとローカル時刻の変換処理が挟まるため、これが(正しい処理であるにも関わらず)問題となる。これに対して取り得る一つの方針は、サーバ・クライアントの両端点において日付時刻の情報を一貫して「ローカル時刻として」シリアライズ・デシリアライズするように措置するというのがある。通信プロトコルのセオリーに反するが、なんであれ一度UTCを介すようなことをすれば元々ユーザーが意図したのが何日何時だったかという情報はその時点で失われてしまうため仕方ないし、これについてそもそも論をしても建設的な結論に辿り着きそうもない。形式の文字列を与えてやればそれをローカル時刻として解釈しインスタンス化してくれる。UTCに変換してしまう。使ってDateオブジェクトをローカル時刻を示す文字列に都度変換している。Jacksonを使っている場合、java.util.Date系のシリアライズ・デシリアライズにデフォルトで用いられるDateFormatは必ずUTCとして日付時刻文字列を解釈/出力してしまう。上書きしてやることでローカル時刻扱いで日付時刻文字列を入出力してくれるようになる。2014年3月14日お勧めカテゴリ英語でアニメ観ようずなじみ深い日本製アニメの英語版DVDで、字幕と音声から英語を学びましょうという趣旨のシリーズ記事です。APIを実装してみましょう。嶋田大貴のブログです。