0

私の Rails アプリには、未加工の UTC 時間で設定して表示したい特定の旅費があります。

これを config/application.rb に追加しました

config.time_zone = 'UTC'
config.active_record.default_timezone = :utc

セット (空の datetime_select)、保存 (UTC として db に保存)、表示 (<%= obj.date.to_utc %>)、および変更 (事前入力された datetime_select) があるようです。

設定、保存、表示に問題はありません。セットの修正を追加しました。時間属性に「+0000」を追加する before_save 呼び出しです。しかし、日時の変更で問題が発生しています。

編集ページを表示すると、datetime_select に以前に保存した日時が表示されます。ただし、6 時間前の時間を表示します。午後 10 時ではなく午後 4 時と表示されます。

これが私のフォームdatetime_selectです:

<%= activity_log_item.object.date.utc %>
<%= activity_log_item.datetime_select :date,
  ampm: true,
  use_short_month: true,
  minute_step: 15, order: [:month, :day, :year, :hour, :minute] %>
</td>

最初の行は、予定時刻 (午後 10 時) を出力します。これは、データベースで同じ時刻であることを確認しました。ただし、datetime_select フォームには午後 4 時が表示されます。

Time.zone =またはなどを使用して明示的に解析しない限り、アプリ内のすべての時間を UTC で設定、保存、表示したいと思います.in_time_zone

Rails 3.2.12 を使用しています。

4

1 に答える 1

0

構成ファイルで設定したタイムゾーンを Rails に強制的に使用させるには、アプリケーションでTime.zone.noworを排他的に使用する必要があります。Time.now.in_time_zoneオブジェクトを UTC の時間にデフォルト設定するには、おそらくコントローラーのアクションでdate_select新しいレコードを で初期化するだけです。new_record.date = Time.zone.nownew

バックグラウンド

デフォルトでは、Rails はすべての日時フィールドを UTC に変換してからデータベースに格納します。Rails がレコードを読み戻すと、その UTC タイムスタンプが構成ファイルで指定されたゾーンにあるように変換されます。Time.nowは、Web サーバーが使用するように構成されているタイムゾーンで Time オブジェクトを返します。Time.zone.nowシステム時刻を構成ファイルのタイムゾーンに変換します。

これが実際の例です。私のコンピューター (別名サーバー) は EST で構成されています。PST を使用するように構成された Rails アプリがあります。データベースはすべてをUTCで保存します

1.9.3p286 > Time.now
 => 2013-11-12 13:33:40 -0500 
1.9.3p286 > Time.now.zone
 => "EST" 
1.9.3p286 > Time.now.in_time_zone
 => Tue, 12 Nov 2013 10:33:40 PST -08:00 
1.9.3p286 > Time.now.in_time_zone.zone
 => "PST" 
1.9.3p286 > Time.zone.now
 => Tue, 12 Nov 2013 10:33:40 PST -08:00 
1.9.3p286 > Time.zone.now.zone
 => "PST" 
1.9.3p286 > Time.parse("12:34:56")
 => 2013-11-12 12:34:56 -0500 
1.9.3p286 > Time.parse("12:34:56").zone
 => "EST" 
1.9.3p286 > Time.parse("12:34:56").in_time_zone
 => Tue, 12 Nov 2013 09:34:56 PST -08:00 
1.9.3p286 > Time.parse("12:34:56").in_time_zone.zone
 => "PST" 
1.9.3p286 > Time.zone.parse("12:34:56")
 => Tue, 12 Nov 2013 12:34:56 PST -08:00 
1.9.3p286 > Time.zone.parse("12:34:56").zone
 => "PST" 
1.9.3p286 > Time.parse("12:34:56 UTC")
 => 2013-11-12 12:34:56 UTC 
1.9.3p286 > Time.parse("12:34:56 UTC").zone
 => "UTC" 
1.9.3p286 > Time.parse("12:34:56 UTC").in_time_zone
 => Tue, 12 Nov 2013 04:34:56 PST -08:00 
1.9.3p286 > Time.parse("12:34:56 UTC").in_time_zone.zone
 => "PST" 
1.9.3p286 > Time.zone.parse("12:34:56 UTC") # Note that the time is parsed as UST and then converted to PST
 => Tue, 12 Nov 2013 04:34:56 PST -08:00 
1.9.3p286 > t = TripTicket.first
 => #<TripTicket ...> 
1.9.3p286 > t.appointment_time # Reading a datetime field from the database
 => Thu, 21 May 2009 10:29:11 PDT -07:00 
1.9.3p286 > t.appointment_time.in_time_zone # No additional conversion because rails already converted it to PST
 => Thu, 21 May 2009 10:29:11 PDT -07:00 
1.9.3p286 > t.appointment_time_before_type_cast # The raw value in the database, stored as UTC
 => "2009-05-21 17:29:11.614345" 
1.9.3p286 > t.appointment_time.utc
 => 2009-05-21 17:29:11 UTC 
1.9.3p286 > t.appointment_time = Time.parse("12:34:56") # Set the time in the server local timezone, i.e. EST
 => 2013-11-12 12:34:56 -0500 
1.9.3p286 > t.appointment_time # Reading the time. Note it's converted to PST already
 => Tue, 12 Nov 2013 09:34:56 PST -08:00 
1.9.3p286 > t.appointment_time.zone
 => "PST" 
1.9.3p286 > t.appointment_time.utc
 => 2013-11-12 17:34:56 UTC 
1.9.3p286 > t.save
 => true 
1.9.3p286 > t.reload
 => #<TripTicket ...> 
1.9.3p286 > t.appointment_time_before_type_cast
 => "2013-11-12 17:34:56" 
于 2013-11-08T14:19:56.647 に答える