在我的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。
答案 0 :(得分:0)
您需要在应用程序中专门使用Time.zone.now
或Time.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"