我正在查询这样的结果:
@logs.where("extract(dow from created_at at time zone ?) = ?", "America/New_York", day_of_week)
但它没有用。 (我还尝试了#34; Time.zone.tzinfo.identifier"在那里,但是在这里使用了测试和清晰度的结果。)例如,某人可能会在东部时间10:30发帖但由于它以UTC格式存储,因此无法显示在包含它的查询中。
我开始提出一个新问题,因为我从这里得到了这个答案,即使它有一个公认的答案,它显然对我不起作用: handling rails + postgres and timezones
这种方法有什么问题吗?还有另一种当前或更好的方式吗?
更新信息:
created_at存储为日期时间。我的时区设置仍然是UTC,但我尝试使用" America / New_York" 获取帖子。区域,应该仍然有效。由于不起作用,我的意思是我将查询第15个并且一些帖子将返回,但是由于UTC差异,在15日当天晚些时候发布的一些帖子仍将在16日返回。包含它的查询是代码块上方的列表。我试图在时区" America / New_York"中从created_at获取dow。
答案 0 :(得分:3)
@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: selecting rows that occur on a certain day of the week, in a specific time zone
答案 1 :(得分:1)
这是我写的关于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
的别名)