当我在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
答案 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)'] }")
是的,我知道它看起来很难看,经过一些研究后我惊讶地发现没有任何“开箱即用”的解决方案。