我正在查询这样的结果:
@logs.where("extract(dow from created_at at time zone ?) = ?", "America/New_York", day_of_week)
但它不起作用。(我也试过"Time.zone.tzinfo"。标识符",但这里使用的结果是为了测试和清晰。)例如,有人可能在东部时间10:30发布帖子,但由于它存储在UTC中,因此不会显示在包含它的查询中。
我开始了一个新的问题,因为我从这里得到了这个答案,它显然不适合我,即使它有一个公认的答案:处理rails + postgres和时区
这个方法有什么我做错了吗?有没有其他当前或更好的方法?
更新信息:
created_at存储为日期时间。我的时区设置仍然是UTC,但我试图获取与"America/New_York"区域的帖子,其中应该仍然工作。通过不工作,我的意思是我会查询15日和一些帖子将返回,但一些在15日晚些时候做出的仍然会在16日返回由于UTC的差异。包含它的查询是代码块上方的列表。我正在尝试从时区"America/New_York"的created_at取下。
@logs = @logs.where("extract(day from (created_at at time zone 'Etc/UTC') at time zone ?) = ?", Time.zone.tzinfo.identifier, params[:date].to_f)
终于想通了!主要来自这个链接,但有一些小的调整:
PostgreSQL:选择一周中的某一天,在一个特定的时区
这是我写的一篇关于rails和时区的博文,你可能会觉得有帮助?http://jessehouse.com/blog/2013/11/15/working-with-timezones-and-ruby-on-rails/
试着像这样运行你的查询
Time.use_zone("Eastern Time (US & Canada)") do
start_at = (Date.current - 1.day).beginning_of_day
end_at = start_at.end_of_day
@logs_from_yesterday = Log.where("created_at BETWEEN ? AND ?", start_at, end_at)
end
Rails将自动将日期时间过滤器偏移到use_zone
块中指定的时区,Date.current
是时区感知的(Time.zone.now.to_date
的别名)