Ruby on rails 与当前时间相比的时间(DB)

Ruby on rails 与当前时间相比的时间(DB),ruby-on-rails,Ruby On Rails,我有几家商店,我想展示它们是否营业 问题是我有我现在的时间 Time.current => Sat, 11 Jun 2016 11:57:41 CEST +02:00 然后,例如,如果我在处为我得到的一家商店取出open\u: 2000-01-01 00:00:00 +0000 所以我现在得到的是: def current_business_hour(current_time: Time.current) business_hours.where('week_day = ?

我有几家商店,我想展示它们是否营业

问题是我有我现在的时间

Time.current
=> Sat, 11 Jun 2016 11:57:41 CEST +02:00
然后,例如,如果我在处为我得到的一家商店取出
open\u:

2000-01-01 00:00:00 +0000
所以我现在得到的是:

  def current_business_hour(current_time: Time.current)
    business_hours.where('week_day = ? AND open_at <= ? AND close_at >= ?',
                         current_time.wday, current_time, current_time).first
  end
def current_business_hour(当前时间:time.current)
营业时间。其中('周/日=?和营业时间=?',
当前时间。wday,当前时间,当前时间)。首先
结束

然后我检查是否有当前的工作时间。然而,这是一个错误的计算,好像两个小时。打开时间和关闭时间应在
时间的时区内。Rails中的当前日期和时间通常以UTC保存在数据库中,Rails在处理记录时自动将时间转换为本地时区

但是,对于纯
time
type列,如果时间仅指定为字符串,Rails不会进行这种自动转换。它必须指定为
时间
对象
,包括本地时区

因此,例如,如果您想将
open_在
时间存储为
14:00
本地时间,则不应使用普通字符串设置该属性,因为它将逐字保存到db,而不是转换为UTC:

business_hour.open_at = '14:00'
business_hour.save
# => UPDATE `business_hours` SET `open_at` = '2000-01-01 14:00:00.000000', `updated_at` = '2016-06-11 15:32:14' WHERE `business_hours`.`id` = 1

business_hour.open_at
# => 2000-01-01 14:00:00 UTC
当Rails读回这样的记录时,它确实认为它是UTC的“14:00”,在CEST区域,这是2个小时

您应该将时间从字符串转换为
时间
对象,因为它将包含正确的本地时区:

business_hour.open_at = Time.parse('14:00')
business_hour.save
# => UPDATE `business_hours` SET `open_at` = '2000-01-01 12:00:00.000000', `updated_at` = '2016-06-11 15:32:29' WHERE `business_hours`.`id` = 1

business_hour.open_at
# => 2016-06-11 14:00:00 +0200

请注意,该列现在存储为UTC时间。现在,您可以安全地将时间列与任何其他rails datetime对象进行比较,例如
时间。在rails中,当前日期和时间通常以UTC格式保存在数据库中,rails在处理记录时会自动将时间转换为本地时区的时间

但是,对于纯
time
type列,如果时间仅指定为字符串,Rails不会进行这种自动转换。它必须指定为
时间
对象
,包括本地时区

因此,例如,如果您想将
open_在
时间存储为
14:00
本地时间,则不应使用普通字符串设置该属性,因为它将逐字保存到db,而不是转换为UTC:

business_hour.open_at = '14:00'
business_hour.save
# => UPDATE `business_hours` SET `open_at` = '2000-01-01 14:00:00.000000', `updated_at` = '2016-06-11 15:32:14' WHERE `business_hours`.`id` = 1

business_hour.open_at
# => 2000-01-01 14:00:00 UTC
当Rails读回这样的记录时,它确实认为它是UTC的“14:00”,在CEST区域,这是2个小时

您应该将时间从字符串转换为
时间
对象,因为它将包含正确的本地时区:

business_hour.open_at = Time.parse('14:00')
business_hour.save
# => UPDATE `business_hours` SET `open_at` = '2000-01-01 12:00:00.000000', `updated_at` = '2016-06-11 15:32:29' WHERE `business_hours`.`id` = 1

business_hour.open_at
# => 2016-06-11 14:00:00 +0200

请注意,该列现在存储为UTC时间。现在,您可以安全地将时间列与任何其他rails datetime对象进行比较,例如
time.current

您如何知道它“计算时间错误”?通常情况下,Rails在DB中以UTC存储时间,因此我希望您在SQL查询中看到时间“向后”2小时,因为您在CEST时区。我使用它允许用户访问存储,当时钟敲响下午2点,我将open_设置为下午2点时,它没有打开,但2小时后它就打开了。您如何知道它“计算的时间错误”? 通常情况下,Rails在DB中以UTC存储时间,因此我希望您在SQL查询中看到时间“向后”2小时,因为您在CEST时区。我使用它允许用户访问存储,当时钟敲响下午2点,我将open_设置为下午2点时,它不会打开,但2小时后它会打开。