4

(Ruby MRI 1.9.2 で Rails 3.2.3 を使用しています)

すべてが UTC で一元的に保存されます。これはいい。各ユーザーには「タイムゾーン」プロパティがあります。私の ApplicationController には、 Time.zone をユーザーの保存されたタイムゾーンに調整する前のフィルターがあります。これもいいですね。

上記を考えると、ユーザーが日時の選択を時刻で完了した場合、その時刻は Time.zone にあると予想され、Rails はこれを自動的に調整して UTC として保存します。これも、うまい。

現在: ユーザーが別のタイム ゾーンで時刻を入力し、UTC として保存できるようにしたいと考えています。ただし、Rails は、完了した日時の選択が (以前に ApplicationController によって設定された) Time.zone に入力されていることを期待しています。したがって、Rails は UTC に正しく調整されません。

第 3 タイム ゾーンにあると入力された時間を節約するという目標を達成するにはどうすればよいですか?

図:

私の使用シナリオは、西海岸のホテルに属するドキュメントの日付を調整するフロリダのユーザーです。彼らは西海岸の時代に入ろうとしています。

jQuery を使用して、スタイル付きピッカーでテキスト ボックスのスタイルを設定しているので、テキスト ボックスに文字列を出力する方法があります。

<%= f.text_field(:created_at, :value => adjusted_to_hotel_time(@document.created_at), :class => 'text datetime_picker') %>

def adjusted_to_hotel_time(time)
  time.in_time_zone(@current_hotel.timezone).to_s(:admin_jquery) # formatted for the jQuery datetime_picker text fields.
end

これは完全に機能していますが、Rails は @document が保存されるときに UTC に正しく調整されません。何がわからないのかわからない - そのフィールドに入力されたデータを@current_hotel.timezoneにあるものとして「タグ付け」して、Railsが親オブジェクトを保存するときにUTCに正しくオフセットするようにするにはどうすればよいですか?

4

2 に答える 2

13

ひびが入った!

基本的に、paramsに送信される文字列は、ホテルのタイムゾーンの時間を表します。組み込みの「use_zone」メソッドを使用して、グローバルTime.zoneをそのホテルに一時的に設定する必要があります。

次に、ユーザーではなくホテルのタイムゾーンを使用して、Railsが期待する値を生成するブロックをメソッドに渡します。つまり、RailsをUTCに変換すると、dbに正しい時刻が表示されます。これは、フォームに入力された時刻がユーザーのタイムゾーンに変換されているためです。オフセットは事実上、互いに打ち消し合っています。

@document.created_at = Time.use_zone(@current_hotel.timezone) {Time.zone.parse("#{params[:document][:created_at]}").in_time_zone(@current_hotel.timezone)}

ここでは基本的に、タイムゾーンが変更されたときにそのTimeオブジェクトの実際の時間を変換せずに、Timeオブジェクトのタイムゾーンを変更しています。(その文を解析して頑張ってください!)

これは私にとってはうまく機能しているように見えますが、私はこれを長い間見てきました。これを行うためのより良い方法/より多くのRails-eyの方法を見てみたいです!

于 2012-04-06T09:23:59.970 に答える
2

列タイプはdatetime日付と時刻のみを格納し、タイムゾーンは格納しません。そこに保存された UTC 時刻の解釈に使用されるタイム ゾーンを保持するために、セカンダリ列を作成する必要がある場合があります。

これら 2 つの値を組み合わせて、最初の入力を再作成できます。

于 2012-04-05T14:52:31.397 に答える