在Rails中保存和查询日期的问题

时间:2011-03-05 16:12:28

标签: ruby-on-rails ruby-on-rails-3

我有一个Appointment模型,对于一个特定的约会,我在2011年3月5日凌晨12:15保存了start_time。看看这个:

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

如您所见,日期被保存错误。有趣的是,Rails会在数据恢复时对其进行补偿。

我认为我的应用程序始终采用这种方式,我只是没有注意到。但是,最近,我写了一个查询,用原始SQL提取日期,所以我得到的时间错了,这会导致问题。

任何人都可以解释为什么会发生这种情况以及如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

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

  • config.active_record.default_timezone
  • config.time_zone

http://guides.rubyonrails.org/configuring.html#configuring-active-record

时区功能在2.1中引入,并没有太大变化。本文给出了一个很好的解释: http://mad.ly/2008/04/09/rails-21-time-zone-support-an-overview/

答案 1 :(得分:0)

Rails在UTC时间(零偏移)中将日期时间保存在数据库中,并将时间转换为显示它时我们打算的时区。因此,当我们直接从数据库解析时,您将获得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

然后如果您使用它,结果将是正确的。