Ruby on rails 日期时间\选择不以utc显示

Ruby on rails 日期时间\选择不以utc显示,ruby-on-rails,datetime,datetime-select,Ruby On Rails,Datetime,Datetime Select,在我的rails应用程序中,我希望在原始UTC时间设置和显示某些旅行费用 我已将其添加到我的config/application.rb中 config.time_zone = 'UTC' config.active_record.default_timezone = :utc 似乎有一个集合(空白日期时间选择)、一个保存(以UTC的形式存储在db中)、一个显示(和一个修改(预填充日期时间选择) 我对集合、保存或显示没有问题。我已为集合添加了一个修复程序-a before_save调用,以将“+

在我的rails应用程序中,我希望在原始UTC时间设置和显示某些旅行费用

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

config.time_zone = 'UTC'
config.active_record.default_timezone = :utc
似乎有一个集合(空白日期时间选择)、一个保存(以UTC的形式存储在db中)、一个显示(和一个修改(预填充日期时间选择)

我对集合、保存或显示没有问题。我已为集合添加了一个修复程序-a before_save调用,以将“+0000”附加到时间属性。但我在修改日期时间时遇到了问题

当我查看编辑页面时,datetime_select将显示以前保存的datetime。但是,它显示的小时数早于6小时。它将显示下午4点,而不是晚上10点

这是我的表单datetime\u选择:

<%= 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\u select表单将显示下午4点

我希望我的应用程序中的所有时间都以UTC设置、保存和显示,除非我以其他方式明确解析它-例如使用
Time.zone=
。in_Time_zone


我正在使用Rails 3.2.12。

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

背景

默认情况下,Rails将在将所有datetime字段存储到数据库之前将其转换为UTC。当Rails读回记录时,它将转换UTC时间戳,使其位于配置文件中指定的区域中。
Time.now
将在web服务器配置为使用的时区中返回时间对象。
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" 
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_时区
=>2013年11月12日星期二10:33:40太平洋标准时间-08:00
1.9.3p286>Time.now.in_Time_zone.zone
=>“PST”
1.9.3p286>Time.zone.now
=>2013年11月12日星期二10:33:40太平洋标准时间-08:00
1.9.3p286>Time.zone.now.zone
=>“PST”
1.9.3p286>时间解析(“12:34:56”)
=> 2013-11-12 12:34:56 -0500 
1.9.3p286>时间解析(“12:34:56”)区域
=>“EST”
1.9.3p286>时区中的Time.parse(“12:34:56”)
=>2013年11月12日星期二09:34:56太平洋标准时间-08:00
1.9.3p286>时区中的Time.parse(“12:34:56”)
=>“PST”
1.9.3p286>时区解析(“12:34:56”)
=>2013年11月12日星期二12:34:56太平洋标准时间-08:00
1.9.3p286>时区解析(“12:34:56”)时区
=>“PST”
1.9.3p286>时间解析(“12:34:56 UTC”)
=>2013-11-12 12:34:56 UTC
1.9.3p286>时间解析(“12:34:56 UTC”)区域
=>“UTC”
1.9.3p286>时区中的Time.parse(“12:34:56 UTC”)
=>2013年11月12日星期二04:34:56太平洋标准时间-08:00
1.9.3p286>时区中的Time.parse(“12:34:56 UTC”)
=>“PST”
1.9.3p286>Time.zone.parse(“12:34:56 UTC”)#请注意,时间被解析为UST,然后转换为PST
=>2013年11月12日星期二04:34:56太平洋标准时间-08:00
1.9.3p286>t=TripTicket.first
=> # 
1.9.3p286>t.appointment_time#从数据库中读取日期时间字段
=>2009年5月21日星期四10:29:11太平洋标准时间-07:00
1.9.3p286>t.appointment_time.in_time_zone#没有额外的转换,因为rails已经将其转换为PST
=>2009年5月21日星期四10:29:11太平洋标准时间-07:00
1.9.3p286>t.appointment_time_before_type_cast#数据库中存储为UTC的原始值
=> "2009-05-21 17:29:11.614345" 
1.9.3p286>t.appointment\u time.utc
=>2009-05-21 17:29:11 UTC
1.9.3p286>t.appointment_time=time.parse(“12:34:56”)#在服务器本地时区(即EST)中设置时间
=> 2013-11-12 12:34:56 -0500 
1.9.3p286>t.预约时间#读取时间。注意,它已转换为PST
=>2013年11月12日星期二09:34:56太平洋标准时间-08:00
1.9.3p286>t.O\U时区
=>“PST”
1.9.3p286>t.appointment\u time.utc
=>2013-11-12 17:34:56 UTC
1.9.3p286>t.save
=>正确
1.9.3p286>t.重新加载
=> # 
1.9.3p286>t.预约时间类型演员前
=> "2013-11-12 17:34:56" 

同样值得注意的是,当我刷新页面时,它会将日期时间(选择预填充时间)切换到utc-到本地-到utc。不一致,但频繁。PS:我通过saltlakecity.craigslist.org的帖子发现了这一点