当我将日期时间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中,就像我存储的时间戳一样,我可以让它工作!任何想法?
答案 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)