19

以下を使用して、Heroku のサイトのタイムゾーンを太平洋標準時 (PST) に設定しました。

heroku config:add TZ=America/Los_Angeles

ユーザーの時間は、PST タイム ゾーンにいるかどうかに関係なく、常に PST になります。

ユーザーの実際のタイム ゾーン (つまり、ユーザーが物理的にいる場所のタイム ゾーン) を取得する最良の方法は何ですか?

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

4

3 に答える 3

22

これには 2 つの方法があります。

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

    Rails を使用しているため、推奨される方法は、javascript を gem として既にバンドルされているようにすることdetect_timezone_railsです。これにより、インストールが簡単になります (アセット パイプラインにすべて自動的にバンドルされるため)。

  • IP アドレスを使用して、国とタイム ゾーンを推測できます。この場合の危険は、ユーザーがプロキシを使用している可能性があることです。また、IP アドレスは通常、都市レベルの解像度を持っていますが、多かれ少なかれ正確である可能性があり、まれに間違ったタイム ゾーンが表示される場合があります。

    IP アドレスを使用して、おおよその都市と緯度/経度を取得できます。Ruby Toolboxでこれを行うことができる多くの gem があります。geocoder. 緯度/経度では、のような宝石を使用してタイムゾーンを取得できますtimezone

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

于 2012-09-07T23:37:56.213 に答える
14

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

アプリがユーザーのサインアップを許可している場合、おそらく User モデルがあり、認証/サインアップに Devise gem を使用している可能性があります。データベース (: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 にフォールバックできます。これを行うgetTimezoneOffset()には、日付オブジェクトでネイティブの JavaScript を使用するか、次の jsTimezoneDetect プラグインを使用することをお勧めします。

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

最後に、両方のハイブリッドを使用し、最初に JavaScript を使用してタイム ゾーン オフセットを検出し、この値を Rails セッション/Cookie に保存し、before_filter を使用して上記のように Time.zone を設定しますが、以前に計算されたセッションの time_zone 値に基づいています。ジャバスクリプトで。

于 2012-09-07T23:58:06.720 に答える
5

または、このすばらしい宝石https://github.com/kbaum/browser-timezone-railsを使用でき ます

于 2014-05-25T07:40:48.180 に答える