我如何使用ruby查询在utc中存储时间的数据库?

时间:2013-09-10 21:28:21

标签: ruby-on-rails timezone mongoid

我在中央时区(ENV['TZ'] = America/Chicago),但我所有的MongoDB条目都以UTC格式存储。因此,如果我想查询所有昨天的条目,我必须过度补偿时区:

  tz = 5.hours
  d1 = Date.yesterday.at_midnight + tz
  d2 = d1 + 1.day
  Entry.where(:created_at.gte => d1, :created_at.lt => d2)

我很确定这是一个重大的黑客,但我不确定如何正确解决这个问题?它应该在数据库端还是在代码中。是否有一些阅读资源可以教会如何正确地做到这一点?

1 个答案:

答案 0 :(得分:1)

假设您的Rails应用程序配置为使用UTC(请参阅config.time_zone中的config/application.rb),那么您应该可以使用Time.zone...来构建日期。

我在太平洋时间,我的应用程序是UTC:

> Time.now
=> 2013-09-10 15:14:46 -0700
> Time.zone.now
=> Tue, 10 Sep 2013 22:14:48 UTC +00:00

我不知道Mongoid,但ActiveRecord会为你做这件事:

> Course.where(['created_at < ?', Time.now]).to_sql
=> "SELECT \"courses\".* FROM \"courses\"  WHERE (created_at < '2013-09-10 22:16:27.106841')"
> Course.where(['created_at < ?', Time.zone.now]).to_sql
=> "SELECT \"courses\".* FROM \"courses\"  WHERE (created_at < '2013-09-10 22:17:03.236353')"