【问题标题】:Rails Time Zone IssuesRails 时区问题
【发布时间】:2012-02-27 13:03:03
【问题描述】:

一段时间以来,我一直在抨击 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?

谢谢!

【问题讨论】:

    标签: ruby-on-rails activerecord time timezone


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-07-16
        • 2012-02-27
        相关资源
        最近更新 更多