Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.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 如果a在rails中设置了正确的时区,为什么我会得到错误的时间?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如果a在rails中设置了正确的时区,为什么我会得到错误的时间?

Ruby on rails 如果a在rails中设置了正确的时区,为什么我会得到错误的时间?,ruby-on-rails,ruby,Ruby On Rails,Ruby,在ruby中,我试图将分支机构的开放和关闭时间保存为time​​在rails上,但当我需要它为-5时,它会节省-6小时的时间差,因为它是本地时间 在其他型号中,我将日期和时间保存为datetime,并保存正确的时间, 但在分行我只需要时间 在我的application.rb中 config.time_zone = 'Monterrey' // It has -5 difference 在我的模式中 create_table "branches", force: :cascade do |t

在ruby中,我试图将分支机构的开放和关闭时间保存为
time
​​在rails上,但当我需要它为-5时,它会节省-6小时的时间差,因为它是本地时间

在其他型号中,我将日期和时间保存为
datetime
,并保存正确的时间, 但在分行我只需要时间

在我的application.rb中

config.time_zone = 'Monterrey' // It has -5 difference
在我的模式中

  create_table "branches", force: :cascade do |t|
    t.string "name"
    t.string "address"
    t.time "open_time"
    t.time "close_time"
  end

// In bookings work correctly

 create_table "bookings", force: :cascade do |t|
    t.string "client_name"
    t.datetime "date"
  end
范例

如果我保存了预订,是否有正确的时区

> Booking.last.date
=> Sun, 12 Apr 2020 17:31:00 CDT -05:00
> Branch.last.open_time
=> Fri, 31 Dec 1999 22:50:00 CST -06:00 
但是如果我保存一个分支,它的时区就错了

> Booking.last.date
=> Sun, 12 Apr 2020 17:31:00 CDT -05:00
> Branch.last.open_time
=> Fri, 31 Dec 1999 22:50:00 CST -06:00 

当显示时间戳时,ruby将告诉您时区的名称(即CDT、CST)和UTC的偏移量(即:-05:00、-06:00)。您看到的两个时区是:

  • 中央夏时制:

    > Booking.last.date
    => Sun, 12 Apr 2020 17:31:00 CDT -05:00
    
  • 中央标准时间:

    > Branch.last.open_time
    => Fri, 31 Dec 1999 22:50:00 CST -06:00 
    
计算夏令时是这些时区之间唯一的区别


从地理位置上看,两个时区代表同一地区,冬季使用CST,夏季使用CDT。

欢迎!命名、缓存和时区总是很难处理。看看好的第一个问题!对问题的简明解释,包括所有相关信息。蒙特雷有两个当地时区。标准时区为CST(S=标准)。但在夏季,使用CDT(D=日光,通常为3月至11月)。因此,夏季日期(如4月12日)的正确时区为CDT,而冬季日期(如12月31日)的正确时区为CST。你的约会没有什么“问题”。尝试将冬季日期转换为夏季时区(反之亦然)没有多大意义。这就像试图将晚上8:00(20:00)设为“上午时间”。是的,但是当我运行
分支时,我如何获得CDT时间。最后。打开时间
您必须将
配置时区
设置为不跟踪夏令时的时区(例如:
GMT-5
),或者手动从一个时区转换到另一个时区。如果你问这个问题是因为你需要在应用程序中相互比较时间戳,那么我会在模型中添加
local\u date
方法。该方法将在本地时区返回<代码>日期>代码,我将在整个代码中使用它而不是<代码>日期>代码。如果应用程序跨越一个时区,我会认真考虑在数据库中存储UTC时间。(至少,这将更容易手工比较不同时区中的时间戳。)@ UrSADK“我会认真考虑在数据库中存储UTC时间”——Rails已经以这种方式工作。数据库不包含任何时区数据。@Stefan,是的,该位的措辞可以更好。。。原则上我同意你的看法,rails应该是这样工作的,ActiveRecord应该在数据库中存储UTC时区。然而,rails非常灵活,我们不知道OP的
config.active\u record.default\u timezone的值。因此,在这种情况下,我认为最好是谨慎行事,并向OP提供常见最佳实践的指示。:)