转换f.datetime_select返回的datetime的时区

时间:2014-06-18 01:40:43

标签: ruby-on-rails datetime

当我在rails形式中使用f.datetime_select时,它会以UTC格式向我的控制器返回日期时间,例如

2014-06-18T11:00:00+00:00

我的本​​地时区设置为我的application.rb文件中指定的墨尔本(+10):

config.time_zone = 'Melbourne'

因此,当我从数据库中检索数据时,它们会自动转换为墨尔本(+10)时区,例如

2014-06-17 19:00:00 +1000

我想将f.datetime_select返回的日期时间与数据库中的字段进行比较。我怎么能这样做?

即。如何将f.datetime选择返回的日期时间的时区更改为'墨尔本' (+10)而不改变实际时间?即转换:

2014-06-18T11:00:00+00:00

2014-06-18T11:00:00+10:00

1 个答案:

答案 0 :(得分:0)

存储在数据库中的所有日期均为UTC时间。因此,当您的应用程序从'params'获取新日期时,您基本上有两个选项:将其保存到ActiveRecord模型,并且在此期间AR将执行所有重量级的决定时区的含义。
如果您不想将数据保存到模型中,则必须自己处理。日期选择控件只返回params hash中3个特殊格式的字符串。 假设我以“生日”的形式命名了字段。控制器会得到类似的东西:

"<your_model_name>" => {... , "birthdate(3i)" => "<day>", "birthdate(2i)" => "<month>", "birthdate(1i)" => "<year>", ...}

所以你可以处理这样的信息:

Time.zone.parse("#{ params[:model]['birthdate(3i)'] }-#{ params[:model]['birthdate(2i)'] }-#{ params[:model]['birthdate(1i)'] }")

是的,我知道它看起来很难看,经过一些研究后我惊讶地发现没有任何“开箱即用”的解决方案。