Posts Tagged ‘TZInfo’

    はてなブックマーク - [Rails] TZInfoで、アクセス元のタイムゾーンに合わせる
    このエントリーをはてなブックマークに追加

    前略、ヤマモトです。

    みなさんはウェブサービスを立ち上げる際、タイムゾーンは意識されているでしょうか。
    日本国内のみのサービスであれば、時間帯は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へ時刻を格納するとき、どの地域であろうとも標準時間でセットしてくれるので、
    このようなカスタマイズも容易です。

    ただし、これが最適解ではないので、何からしらの別の方法が見つかればと思います。