一段时间以来,我一直在为Rails中的时区而头疼。问题是:
我希望用户能够在time_select
字段中输入当地时间(例如上午9:30)。根据用户选择的时区,应将其存储在数据库中作为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?
谢谢!
如果您是专业会员,下面的Railscasts一集非常适合解释如何做到这一点:
http://railscasts.com/episodes/106-time-zones-revised
它基本上使用了与Ben W的方法相同的方法,但使用了around过滤器而不是before过滤器。Timezone可能是线程安全的,所以这可能不重要,但我无论如何都会这么做。
看看http://archives.ryandaigle.com/articles/2008/1/25/what-s-new-in-edge-rails-easier-timezones
它涵盖了使用过滤器为用户设置时区。您应该能够在现有视图的输出中设置用户配置文件的属性(然后可以将其加载到过滤器中)。