Ruby on rails 整理输入和保存的数据库数据之间的时区

Ruby on rails 整理输入和保存的数据库数据之间的时区,ruby-on-rails,timezone,Ruby On Rails,Timezone,因此,输入表单从datetime\u select "meeting"=>{"start_time[...] "start_time(4i)"=>"13", "start_time(5i)"=>"15"} 然后,控制器根据父对象的属性计算结束时间 @initiate = DateTime.civil(date["start_time(1i)"].to_i, date["start_time(2i)"].to_i, date["start_time(3i)"].to_i, da

因此,输入表单从datetime\u select

"meeting"=>{"start_time[...] "start_time(4i)"=>"13", "start_time(5i)"=>"15"}
然后,控制器根据父对象的属性计算结束时间

@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"]
解决这一问题最有效但最简洁的方式是什么


注意,这是为了使用一致的时区数据写入数据库,这排除了用户时区查看问题…

似乎对
日期时间执行加减操作会使用全局
配置时区
设置进行隐式时区转换,而不是
日期时间
中提供的偏移量(未指定时默认为0)

要解决此问题,请在
config/application.rb
文件中设置
config.time\u zone='UTC'


这将影响整个应用程序,使用UTC而不是系统默认时区。

civil
上有一个包含偏移量的参数,但未指定时默认为UTC(0)。因此,您的开始时间是UTC,结束时间也是UTC,因此这里没有任何东西受您的本地时区影响,因此,您将15:15视为结束时间的唯一方式是,如果您实际添加120分钟,而不是60分钟。是的,这就是问题所在。输入数据以UTC为单位。但是,通过以日期时间格式运行计算,rails(或ruby)将计算转换为本地时区,然后再转换为UTC。因此,额外的60分钟。现在假设用户在不同的时区,并且想要查看他们的本地区域中的数据,中间的这种处理必须是不可知的。还没有找到一个非直截了当的方法来这么做…很有趣。如果设置
config.time\u zone='UTC'
,是否有帮助?(在
config/application.rb
文件中)有趣的想法是,它确实解决了计算问题。但那是不符合轨道的,是吗?不确定。我对Rails不太在行。但一般来说,依靠服务器的时区设置并不是一个好主意。在环境中设置它稍微好一点,但理想情况下,Rails会在添加时使用
DateTime
中提供的偏移量,而不是使用全局设置。我在任何地方都没有看到记录,所以可能是个bug?IDK。