【问题标题】:rails - Store DateTime objects in same time zone as timestampsrails - 将 DateTime 对象存储在与时间戳相同的时区
【发布时间】:2014-10-25 20:26:14
【问题描述】:

当我将 DateTime schedule_time 保存到数据库时,它会根据我的本地时间保存,但时间戳 (created_at) 显然是以 UTC 保存的(比我的太平洋时间提前 7 小时)

因此,如果我现在提交设置我的schedule_time 的表单,它将与我的created_at 相差 7 个小时。

我需要向许多用户展示他们在自己选择的区域中的时间,并且我还需要相互比较时间,所以我希望所有数据库条目都在同一个区域中。在我的机器上进行测试,我的用户将他的区域保存为太平洋 (-7:00),但它在当地时间保存 schedule_time,而不是真正的 UTC,所以当我尝试像这样显示时间时:

@item.schedule_time.in_time_zone(@user.time_zone)

它实际上需要存储的日期时间并从中减去 7 小时,从而使我比我想要的时间提前了 7 小时。我认为最好的办法是以统一的方式存储所有日期时间,以便我可以轻松地比较它们。

更改此值config.time_zone = 'UTC' 不会更改我的日期时间的存储格式。无论如何,它都存储在我的当地时间,同时将时间戳存储在真实的 UTC 中。

我还尝试在存储之前重新格式化日期时间,使用in_time_zone(@user.time_zone),但它对存储的时间没有影响。

如果我可以像存储我的时间戳一样将schedule_time 存储在UTC 中,我就可以完成这项工作!有什么想法吗?

【问题讨论】:

  • schedule_time = schedule_time.utc 应该可以解决问题,然后再将其存储到数据库中

标签: ruby-on-rails datetime


【解决方案1】:

如果您想在将 schedule_time 转换为 UTC 之前将其存储到数据库中,则可以在 Item 模型中包含 before_save 回调以将其转换为如下:

before_save { |item| item.schedule_time = item.schedule_time.utc }

【讨论】:

  • 它对我不起作用。我尝试了before_save 方法,并且还只是在保存之前使用 schedule_time.utc 创建了 ActiveRecord 项目。正如我所说,任何改变日期时间的尝试似乎对实际保存的内容没有影响。在最后一次尝试的情况下,数据库将 schedule_time 显示为 2014-10-25 14:01:03.000000,将 created_at 显示为 2014-10-25 21:01:08.834657。需要明确的是 schedule_time 是我的当地时间,与我提交到表单中的确切时间相同。
  • time_zone改成config.time_zone = 'UTC'后是重启服务器还是rails console
  • 不知何故,它似​​乎认为它在 UTC 中保存,即使它显示我的当地时间。如果我做一个schedule_time.utc?,我就明白了。好像它认为UTC只是+0。因此,通过不添加任何小时的 UTC。无论它认为它在做什么,我的schedule_time 显然是在我的当地时间,我的时间戳显然是从那里+7(相当于UTC)。 created_at.utc? 的时间戳也返回 true
  • 如果在 Rails 控制台中输入 Time.currentTime.current.utc 会得到什么?
  • 我每次进行更改时都会重新启动 Rails 服务器和 Rails 控制台,以确保我不会发疯。我显然是。
【解决方案2】:

对不起,我完全走错了方向。

问题在于我使用的 jquery 日期选择器 (will_pickdate)。它返回日期和时间,但时区偏移量为 +0000。默认情况下,选择器会自动填充当前本地时间,但是当我提交时,rails 基本上认为它正在接收 UTC 时间并将其添加为我的本地时间,但带有 +0000。

为了正确存储日期,我必须保持选择器中的时间和日期完好无损,但只需将 +0000 部分移到适当的位置:

my_time.change(offset: user_time_zone_offset)

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2014-01-07
    • 2020-11-21
    • 1970-01-01
    • 2023-03-19
    • 2017-06-24
    • 1970-01-01
    • 2012-02-04
    • 2015-04-02
    相关资源
    最近更新 更多