Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails rails—将DateTime对象存储在与时间戳相同的时区中_Ruby On Rails_Datetime - Fatal编程技术网

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

Ruby on rails rails—将DateTime对象存储在与时间戳相同的时区中,ruby-on-rails,datetime,Ruby On Rails,Datetime,当我将DateTimeschedule\u time保存到数据库时,它会根据我的本地时间进行保存,但时间戳(创建时间)显然是以UTC格式保存的(比我的太平洋时间提前7小时) 因此,如果我现在提交表单设置我的计划时间,它将与我在创建的时间不同7小时 我需要向许多用户显示他们在自己选择的区域中的时间,并且我还需要相互比较时间,所以我希望所有db条目都在同一个区域中。在我的机器上测试时,我的用户将其区域保存为Pacific(-7:00),但其保存时间schedule_time为本地时间,而不是UTC,

当我将DateTime
schedule\u time
保存到数据库时,它会根据我的本地时间进行保存,但时间戳(创建时间)显然是以UTC格式保存的(比我的太平洋时间提前7小时)

因此,如果我现在提交表单设置我的
计划时间
,它将与我在创建的
时间不同7小时

我需要向许多用户显示他们在自己选择的区域中的时间,并且我还需要相互比较时间,所以我希望所有db条目都在同一个区域中。在我的机器上测试时,我的用户将其区域保存为Pacific(-7:00),但其保存时间
schedule_time
为本地时间,而不是UTC,因此当我尝试按如下方式显示时间时:

@item.schedule_time.in_time_zone(@user.time_zone)
它实际上是把存储的日期时间减去7个小时,给我7个小时的时间。我认为最好的办法就是以统一的方式存储所有的日期时间,这样我就可以很容易地比较它们

更改此值
config.time\u zone='UTC'
不会更改我的日期时间的存储格式。它以我的本地时间存储,而以实际UTC存储时间放大器

我还尝试在存储日期时间之前重新格式化日期时间,在时区(@user.time\u zone)中使用
,但它对存储的时间没有影响


如果我能像存储时间戳一样,在UTC中存储
计划时间
,我就能做到这一点!有什么想法吗?

如果您想在将时间存储到数据库之前将时间转换为UTC,您可以在
模型中包含一个
保存
前回调,将其转换如下:

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

对不起,我完全走错路了

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

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

my_time.change(offset: user_time_zone_offset)

schedule\u time=schedule\u time.utc
应该在将其存储到数据库之前完成这项工作,因为它对我不起作用。我尝试了
before\u save
方法,并且在保存之前使用schedule\u time.utc创建ActiveRecord项。正如我所说,任何转换日期时间的尝试似乎都不会影响实际保存的内容。在最后一次尝试的情况下,db显示计划时间为
2014-10-25 14:01:03.000000
,创建时间为
2014-10-25 21:01:08.834657
。为了清楚起见,计划时间是在我的本地时间,与我提交到表单中的时间相同。在将
时区更改为
config.time\u zone='UTC'
后,您是否重新启动了服务器或
rails控制台
?尽管它显示了我的本地时间,但它似乎认为它在节约UTC时间。如果我做一个
时间表\u time.utc?
我就知道了。它似乎认为UTC只是+0。因此,通过不添加任何小时的UTC。无论它认为它在做什么,我的
计划时间
显然是在我的本地时间,我的时间戳显然是+7(相当于UTC)。如果在rails控制台中键入
Time.current
Time.current.utc
,则在.utc?创建的
的时间戳也会返回true?每次进行更改时,我都会重新启动rails服务器和rails控制台,以确保我不会神志不清。我显然是。