2012-09-07 4 views
13

使用した場合、現在のユーザーのタイムゾーンを取得する方法 - 彼らがPSTタイムゾーンにいるかどうか。レール:ユーザーのための</p> <pre><code>heroku config:add TZ=America/Los_Angeles </code></pre> <p>タイムズはPSTに常に今ある:私は使用して、太平洋標準時(PST)にHerokuの上の私たちのサイトのタイムゾーンを設定Herokuの

ユーザーの実際のタイムゾーン(物理的にどこに位置している時間帯)を取得するには、どのような方法が最適ですか?

これは、Herokuとは対照的に、Rails(またはJavascript?)を使用して解決できると思います。

+0

を使用することができ、そしてそれは私がJSと、クライアント側で何かをする必要があり、サーバに戻ってそれを渡すだろうと思わ。お知らせ下さい。 –

答えて

20

これを行うには2通りの方法があります。

  • 実際には、javascriptを使用して現在の時刻/タイムゾーンを取得できます。ユーザーのコンピュータ時間が正しく設定されていない可能性があります。この場合、表示されるタイムゾーンは正しくありません。

    あなたはRailsを使用しているので、お勧めの方法は、すでにdetect_timezone_railsのようなgemとして束ねられているjavascriptを取得することです。これは簡単にインストールできます(アセットパイプラインにすべてバンドルされているため)

  • IPアドレスを使用すると、国とタイムゾーンを推測できます。この場合の危険性は、ユーザーがIPアドレスは一般的に都市レベルの解決策を持っていますが、まれに正しいタイムゾーンを指定しない場合があります。

    IPアドレスを使用すると、緯度/経度:Ruby Toolboxでこれを行うことができる多くの宝石、例えばgeocoder。緯度/経度ではtimezoneのような宝石を使ってタイムゾーンを得ることができます。

また、上記のいずれかを使用して、ウェブサイトのタイムゾーンを手動で変更することもできます(登録されている場合はこの設定をデータベースに保存するか、ブラウザのCookieとして保存します)。これはタイムゾーンが間違っている場合に便利です。

11

アプリの設定に応じて、これを行う方法はいくつかあります。いずれもHeroku環境に固有のものではありません。

あなたのアプリがサインアップできるのであれば、おそらくUserモデルを持っていて、認証/サインアップにDevise gemを使用している可能性があります。 db(:time_zone)にフィールドを追加し、登録時にユーザーのタイムゾーンをこのフィールドに格納します。

>> rails generate migration add_time_zone_to_users time_zone:string 
>> rake db:migrate 

Railsはあなたにあなたのユーザーに表示することができ、その中にすべての時間帯で選択リストを与える便利なtime_zone_selectフォームヘルパーを提供します。これをユーザーのサインアップフォームに追加し、サインアップ時にユーザーがタイムゾーンを設定できるようにします。 http://apidock.com/rails/ActionView/Helpers/FormOptionsHelper/time_zone_select

アプリケーションコントローラでは、次のようなことができます。

before_filter :set_time_zone 

def set_time_zone 
    #current user is a devise method see https://github.com/plataformatec/devise 
    Time.zone = current_user.time_zone if current_user 
end 

はその後、ユーザーのタイムゾーンの時刻を表示する時間インスタンス上のアプリコール.in_time_zoneに日付を表​​示するとき。

<%= Time.now.in_time_zone %> or <%= @your_model.created_at.in_time_zone %> 

あなたがユーザー認証をしていない場合は、JavaScriptにフォールバックする可能性があります。

http://www.pageloom.com/automatic-timezone-detection-with-javascript

が最後にあなたが両方のハイブリッドを使用することができますし、まず自分のタイムゾーンではJavaScriptを使用してオフセット検出:これを行うには、日付オブジェクトにネイティブのJavaScript getTimezoneOffset()を使用するか、またはより良い次jsTimezoneDetectプラグインを使用することができますこの値をrailsのセッション/クッキーに保存し、before_filterを使用して上記のようにTime.zoneを設定しますが、以前はjavascriptで計算されたtime_zone値のセッションに基づいています。

5

それとも、私がウェブを中心に見てきた、この素晴らしい宝石 https://github.com/kbaum/browser-timezone-rails

+0

明らかに、このアプローチは、フードの下でjstimezoneに依存するので、バグです。 http://stackoverflow.com/questions/30756405/cant-set-timezone-using-abbreviation/30758246#30758246 – Evolve

関連する問題

 関連する問題