前略、ヤマモトです。
みなさんはウェブサービスを立ち上げる際、タイムゾーンは意識されているでしょうか。
日本国内のみのサービスであれば、時間帯は1つなので特に意識する必要はないと思いますが、
これが全世界で利用して欲しいサービスであれば話が変わります。
日本時間で「午後1時から午後2時まで限定公開」というプレミアコンテンツを予告し、全世界に公開したとしても、日本時間であると注釈しない限り、ユーザーはその地域の時間だと捉えるでしょう。
「見てみたらまだ始まってなかった」ならまだいいでしょうが、日本は、全世界でも先の時間を行ってますから、ほとんどの地域の人からしたら「見てみたら終わってた」状態ですね。
話は逸れますが、アメリカのような複数のタイムゾーンがある国では、ウェブサービスの時間の処理はどう行っているんでしょうか。
いや、ウェブサービスに限らず、例えばテレビ番組は、ニューヨークでは午後7時から放送でも、サンフランシスコでは午後4時からとなるので、
この場合の宣伝の仕方はどうしているんでしょうね。
恐らく時間帯の注釈があるんでしょうが、アメリカに知り合いはいないのでちょっと謎です。
YouTubeやFacebookといった全世界向けウェブサービスを見てみましたが、
アメリカのプロキシ経由でアクセスしたり、言語設定を「英語」にしてアクセスしたりしても、とくに時間に変化はなさそうでした。
かといって、タイムゾーンを考慮しない実装はできません。
というのは、自社サービスであるZENPREの話ですが、これにはプレゼンテーションの開始時間と終了時間という概念があり、
その間でしかリアルタイムな配信はされません。
つまり、その地域に合った時間を表示しないと、世界中の人が見ることはできません。
1番の解決策は、ユーザーにタイムゾーンを設定してもらうことでしょう。
初めてアクセスがあった場合、必ずタイムゾーンの設定をしてもらう。
あとはcookieにでも保存しておいて次回以降は、そのタイムゾーンを使う。
ですが、その機構を作るための期間が取れず、また、果たしてそれが最適解だろうかというのもあったため、実装を見送りました。
さて、かなり前置きが長くなってしまいましたが、
ユーザーのタイムゾーンを取得するにあたって、自動で取得するため「TZInfo」というRubyのライブラリを使用することにしました。
TZInfo – Ruby Timezone Library
TZInfoは、国コードから該当するタイムゾーンを表示してくれます。
例えば日本の場合、
tz = TZInfo::Country.get("JP") tz.zone_identifiers # "Asia/Tokyo" |
となります。
国コードの取得は
Locale.get.country |
でできます。
これを、application_controller.rbあたりで
Time.zone = tz.zone_identifiers[0] |
とすれば、タイムゾーンが動的に設定できます。
※tz.zone_identifiersは配列
ただし、これがタイムゾーンが複数ある地域になると問題です。
tz = TZInfo::Country.get("US") tz.zone_identifiers ⇒America/New_York America/Detroit America/Kentucky/Louisville America/Kentucky/Monticello America/Indiana/Indianapolis ... America/AdakPacific/Honolulu |
となり、候補が複数取得できます。
ここから、その地域を特定するのは不可能かと思います。
現状では、「複数取得されたら、1番目のタイムゾーンを選択する」ことにしました。
さらに、時間表示の部分には全て、現在適用されているタイムゾーンを表示することで、時間誤認のリスクを減らしています。
現在のタイムゾーンを表示するメソッド
Time.zone.now.zone ⇒ "JST" ※日本の場合 |
以上が、タイムゾーンを自動で取得する方法です。
Railsは、DBへ時刻を格納するとき、どの地域であろうとも標準時間でセットしてくれるので、
このようなカスタマイズも容易です。
ただし、これが最適解ではないので、何からしらの別の方法が見つかればと思います。