rails - 将DateTime对象存储在与时间戳相同的时区中

时间:2014-10-25 20:26:14

标签: ruby-on-rails 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小时才能得到它。我认为最好的方法是以统一的方式存储所有日期时间,以便我可以轻松地比较它们。

更改此值config.time_zone = 'UTC'不会更改我的日期时间的存储格式。它存储在我当地的时间,而不是以实际UTC存储timeststamp。

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

如果我可以将schedule_time存储在UTC中,就像我存储的时间戳一样,我可以让它工作!任何想法?

2 个答案:

答案 0 :(得分:0)

如果您希望在将schedule_time转换为UTC之前将其存储在数据库中,您可以在before_save模型中添加Item回调,以便将其转换为:

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

答案 1 :(得分:0)

抱歉,我完全走错了路。

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

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

my_time.change(offset: user_time_zone_offset)