【问题标题】:Ironing out Time zones between input and saved database data消除输入和保存的数据库数据之间的时区
【发布时间】: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。

标签: ruby-on-rails timezone


【解决方案1】:

似乎对DateTime 执行加法或减法会使用全局config.time_zone 设置进行隐式时区转换,而不是DateTime 中提供的偏移量(未指定时默认为0)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2018-03-21
    • 2018-07-24
    • 2011-07-16
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多