datetime_select不以utc显示

时间:2013-10-23 20:38:34

标签: ruby-on-rails datetime datetime-select

在我的rails应用程序中,有一些旅行费用,我希望它们以原始UTC时间设置和显示。

我已将此添加到我的config / application.rb

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

似乎有一个集合(空白的datetime_select),一个保存(以db格式存储在UTC中),一个显示(<%= obj.date.to_utc%>和一个修改(预填充的datetime_select)。

我没有设置,保存或显示的问题。我添加了一个修复集 - 一个before_save调用,将'+0000'附加到time属性。但是我遇到了修改日期时间的问题。

当我查看编辑页面时,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点),我已经确认在db中的同一时间。但是,datetime_select表单将显示在下午4点。

我希望我的应用中的所有时间都能以UTC格式设置,保存和显示,除非我明确解析它 - 例如使用Time.zone =.in_time_zone

我正在使用Rails 3.2.12。

1 个答案:

答案 0 :(得分:0)

您需要在应用程序中专门使用Time.zone.nowTime.now.in_time_zone才能强制Rails使用您在配置文件中设置的时区。要将date_select对象默认为UTC时间,只需使用new_record.date = Time.zone.now初始化新记录,可能在控制器的new操作中。

<强>背景

默认情况下,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"