【发布时间】:2017-12-28 14:47:43
【问题描述】:
所以输入表单从 datetime_select 提供
"meeting"=>{"start_time[...] "start_time(4i)"=>"13", "start_time(5i)"=>"15"}
然后控制器根据父级的属性计算 end_time
@initiate = DateTime.civil(date["start_time(1i)"].to_i, date["start_time(2i)"].to_i, date["start_time(3i)"].to_i, date["start_time(4i)"].to_i, date["start_time(5i)"].to_i)
params[:meeting][:end_time] = @initiate + (@product.minutes.to_i).minutes
但是,给定 60 分钟的持续时间(比格林威治标准时间差 1 小时让事情变得更有趣!),数据库正在填充以下内容:
["start_time", "2017-12-29 13:15:00.000000"], ["end_time", "2017-12-29 15:15:00.000000"]
解决此问题的最有效但最简洁的方法是什么?
注意这是为了用一致的时区数据写入数据库,这不包括用户 time_zone 查看问题...
【问题讨论】:
-
civil上有一个参数可以包含偏移量,但未指定时默认为 UTC (0)。因此,您的开始时间是 UTC,而您的结束时间也是 UTC,所以这里的任何内容都不受您当地时区的影响,因此您看到 15:15 作为结束时间的唯一方法是您实际添加了 120 分钟不是 60。 -
是的,这就是问题所在。输入数据采用 UTC。但是通过以日期时间格式运行计算,rails(或 ruby)将计算转换为本地时区,然后再将其转换为 UTC。因此额外的60分钟。现在假设用户处于不同的时区并且想要查看其本地区域中的数据,中间的这种处理必须是不可知的。还没有想出一个不生硬的方法来做到这一点......
-
有趣。如果你设置
config.time_zone = 'UTC',有帮助吗? (在config/application.rb文件中) -
有趣的想法,是的,它确实解决了计算问题。但这变得不像 Rails 了,是吗?
-
不确定。我对 Rails 做的不多。但总的来说,取决于服务器的时区设置并不是一个好主意。在环境中设置它会好一些,但理想情况下,Rails 会在您进行添加时使用
DateTime中提供的偏移量,而不是使用全局设置。我在任何地方都没有看到记录,所以也许这是一个错误? IDK。