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中不同区域的日期时间/时间的问题_Ruby On Rails_Ruby_Datetime - Fatal编程技术网

Ruby on rails 比较Rails中不同区域的日期时间/时间的问题

Ruby on rails 比较Rails中不同区域的日期时间/时间的问题,ruby-on-rails,ruby,datetime,Ruby On Rails,Ruby,Datetime,在我的应用程序中,用户设置任务的特定结束时间。加载任务时,它会使用该任务的信息创建相应的签入(在本例中,self是任务): 我已经将config.time_zone设置为“东部时间(美国和加拿大)”,但不是创建UTC任务,而是将其提交为EST,然后从中减去4小时 [2] pry(main)> CheckIn.last.end_time CheckIn Load (0.7ms) SELECT "check_ins".* FROM "check_ins" ORDER BY "check_

在我的应用程序中,用户设置任务的特定结束时间。加载任务时,它会使用该任务的信息创建相应的签入(在本例中,self是任务):

我已经将config.time_zone设置为“东部时间(美国和加拿大)”,但不是创建UTC任务,而是将其提交为EST,然后从中减去4小时

[2] pry(main)> CheckIn.last.end_time
  CheckIn Load (0.7ms)  SELECT "check_ins".* FROM "check_ins" ORDER BY "check_ins"."id" DESC LIMIT 1
=> Sun, 20 Oct 2013 19:30:00 EDT -04:00

[3] pry(main)> Task.last.end_time
  Task Load (0.7ms)  SELECT "tasks".* FROM "tasks" ORDER BY "tasks"."id" DESC LIMIT 1
=> Sun, 20 Oct 2013 23:30:00 EDT -04:00
根据用于创建模型的任务,该模型实例的结束时间应为晚上11点。这是我第一次在Rails中与time一起工作,因此非常感谢您的帮助。多谢各位

更新: 将其切换回UTC并将该方法添加到ApplicationController,但这里真正的问题是我创建签入的方式。由于Task.end_time在创建时用作参考,并作为EST从数据库中调用,因此在创建签入时偏移量增加了一倍。真奇怪。我的解决方案是使用。创建时更改:

CheckIn.create(task_id: self.id, start_time: self.create_checkin_start_time(day).change(:hour => self.start_time.hour + 4), end_time: self.create_checkin_end_time(day).change(:hour => self.end_time.hour + 4))

这决不是一个好的/永久的解决方案。我现在有点时间紧张,这将适合我的需要

我建议将
config.time\u zone
设置为
UTC
,这样您就不会看到数据库中发生这种奇怪的变化

如果您想强制应用程序的用户使用特定时区,那么最好的选择是在
应用程序控制器
中使用
前过滤器

before_filter :set_timezone
def set_timezone
  Time.zone = "Eastern Time (US & Canada)"
end
这样,所有时间都将作为UTC时间保存到数据库中,但将在站点上显示为东部时间


这样做的原因很简单:从一个世界中心时间(UTC)转换比从某个任意点转换回UTC然后再转换到另一个任意点更容易

before_filter :set_timezone
def set_timezone
  Time.zone = "Eastern Time (US & Canada)"
end