Rails时区问题

时间:2012-02-05 22:18:41

标签: ruby-on-rails activerecord time timezone

我一直在为Rails中的时区猛烈抨击一段时间。这是问题所在:

我希望用户能够在当地时间(例如上午9:30)输入time_select字段。根据用户选择的时区,这应该作为UTC存储在数据库中(例如美国东部时间上午9:30保存为14:30)

然后,只需使用Time.zone正确显示它。

但是,似乎time_select创建了一个多参数赋值的散列值,假定用户输入的时间是UTC。无论我尝试什么,我都无法将其强制进入用户的当地时间。例如:

ruby-1.9.2-p290 :016 > Time.use_zone("Eastern Time (US & Canada)") do
ruby-1.9.2-p290 :017 >     a.attributes = {"starttime(1i)"=>"2000", "starttime(2i)"=>"1", "starttime(3i)"=>"1", "starttime(4i)"=>"09", "starttime(5i)"=>"30"}
ruby-1.9.2-p290 :018?>   end
 => {"starttime(1i)"=>"2000", "starttime(2i)"=>"1", "starttime(3i)"=>"1", "starttime(4i)"=>"09", "starttime(5i)"=>"30"} 
ruby-1.9.2-p290 :019 > a.starttime
 => 2000-01-01 09:30:00 UTC

我见过使用config.time_zone的建议,但我希望这适用于多个时区的用户,因此网站范围的配置设置似乎不是正确的解决方案。

如何将数据库中用户提供的值保存为UTC?

谢谢!

2 个答案:

答案 0 :(得分:1)

查看http://archives.ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones

它涵盖了使用过滤器为用户设置时区。您应该能够在现有视图的输出中工作,以在用户的​​配置文件上设置属性(然后可以将其加载到过滤器中)。

答案 1 :(得分:1)

如果您是专业会员,以下Railscasts剧集非常适合解释如何执行此操作:

http://railscasts.com/episodes/106-time-zones-revised

它基本上使用与Ben W的方法相同的方法,但使用around过滤器而不是before过滤器。 Time.zone可能是线程安全的,所以这可能是不必要的,但无论如何我都会这样做。