0

我在中央时区 ( 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)

我很确定这是一个重大的黑客攻击,但我不确定如何正确解决这个问题?它应该在数据库端还是在代码中。是否有一些阅读资源可以教如何正确执行此操作?

4

1 回答 1

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')"
于 2013-09-10T22:17:21.637 回答