Ruby on rails Rails中保存和查询日期的问题

Ruby on rails Rails中保存和查询日期的问题,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我有一个约会模式,对于一个特定的约会,我将其保存为2011年3月5日上午12:15的开始时间。看看这个: irb(main):002:0> a = Appointment.find(15) => #<Appointment id: 15, start_time: "2011-03-05 05:15:00", created_at: "2011-03-05 03:42:03", updated_at: "2011-03-05 03:42:03", stylist_id: 13,

我有一个
约会
模式,对于一个特定的约会,我将其保存为2011年3月5日上午12:15的
开始时间
。看看这个:

irb(main):002:0> a = Appointment.find(15)
=> #<Appointment id: 15, start_time: "2011-03-05 05:15:00", created_at: "2011-03-05 03:42:03", updated_at: "2011-03-05 03:42:03", stylist_id: 13, client_id: 8>
irb(main):003:0> a.start_time
=> Sat, 05 Mar 2011 00:15:00 EST -05:00
irb(main):002:0>a=Appointment.find(15)
=> #
irb(主):003:0>a.开始时间
=>美国东部时间2011年3月5日星期六00:15:00-05:00
如您所见,日期保存错误。不过,有趣的是,当数据返回时,Rails会对此进行补偿

我想我的应用程序一直都是这样,我只是没有注意到。不过,最近我编写了一个查询,用原始SQL提取日期,所以我得到了错误的时间,这导致了问题


有人能解释一下为什么会发生这种情况,以及我能做些什么来解决这个问题吗?

Rails是故意这么做的。检查您的时区设置:

  • config.active\u record.default\u时区
  • 配置时区

时区特性是在2.1中引入的,并没有太大变化。这篇文章给出了一个很好的解释:
Rails是故意这样做的。检查您的时区设置:

  • config.active\u record.default\u时区
  • 配置时区

时区特性是在2.1中引入的,并没有太大变化。这篇文章给出了一个很好的解释:

Rails以UTC时间(零偏移量)在数据库中保存datetime,并将时间转换为我们在显示它时想要的时区。因此,当我们直接从数据库解析时,您将获得UTC时间。如果您尝试像这样将其转换为时间:

time_string = #raw string obtained from database(like "2011-03-05 05:15:00")
time_object = Time.parse(time_string)
您将根据计算机或服务器的时区获得带有偏移量的时间。Ruby这样解析时间。它将花费时间并给出您机器的时区(这在这里是不正确的,因为时区实际上是UTC,因为它来自数据库)。我遇到了这个问题,当我从数据库的原始sql字符串解析时间时,通过添加UTC解决了这个问题

time_string << " UTC" 
time_object = Time.parse(time_string) # gives time zone as UTC

time\u stringRails以UTC时间(零偏移量)在数据库中保存datetime,并将时间转换为我们在显示它时想要的时区。因此,当我们直接从数据库解析时,您将获得UTC时间。如果您尝试像这样将其转换为时间:

time_string = #raw string obtained from database(like "2011-03-05 05:15:00")
time_object = Time.parse(time_string)
您将根据计算机或服务器的时区获得带有偏移量的时间。Ruby这样解析时间。它将花费时间并给出您机器的时区(这在这里是不正确的,因为时区实际上是UTC,因为它来自数据库)。我遇到了这个问题,当我从数据库的原始sql字符串解析时间时,通过添加UTC解决了这个问题

time_string << " UTC" 
time_object = Time.parse(time_string) # gives time zone as UTC

time\u string似乎
config.time\u zone
(或
config.
任何东西)在Rails 3中都不起作用。我得到
/home/jason/snip/config/environment.rb:9:未定义的局部变量或方法“config”
另外,如果我转到控制台并键入
Time.zone
,它会显示Eastern,这是正确的。对于我所有的解析,我都在做
Time.zone.parse
,而不是Rails 3中的
Time.parse
@Jason,您应该将配置变量放在应用程序对象(Application.rb)而不是environment.rb中。请参阅@Jason ActiveRecord在保存对象时自动进行时区转换。似乎在Rails 3中,
config.time\u zone
(或
config.
anything)不起作用。我得到
/home/jason/snip/config/environment.rb:9:未定义的局部变量或方法“config”
另外,如果我转到控制台并键入
Time.zone
,它会显示Eastern,这是正确的。对于我所有的解析,我都在做
Time.zone.parse
,而不是Rails 3中的
Time.parse
@Jason,您应该将配置变量放在应用程序对象(Application.rb)而不是environment.rb中。请参阅@Jason ActiveRecord在保存对象时自动进行时区转换。在日期末尾添加“UTC”效果很好。谢谢。作为替代方案(这将要求您修改数据库中的数据),您可以将ActiveRecord配置为使用本地时间,这将在您的数据库中存储“正确”的时间,并且您不必在整个应用程序中散布转换代码。将“UTC”添加到我的日期末尾效果很好。谢谢。作为替代方案(这将要求您修改数据库中的数据),您可以将ActiveRecord配置为使用本地时间,这将在您的数据库中存储“正确”的时间,并且您不必在整个应用程序中散布转换代码。