我正在尝试在特定用户的时区内,显示过去30天每天的展示量计数。问题在于,根据时区不同,计数并不总是相同的,我在查询中遇到了麻烦。
例如,假设在第一天晚上11:00(CDT -5)发生两次展示,以及第二天凌晨1:00发生一次展示(CDT)。如果您使用UTC (+0)进行查询,则会得到所有3个展示在第二天发生,而不是第一天发生两个展示和第二天发生一个展示。两个CDT时间都落在UTC的第二天。
这是我现在正在做的事情,我知道我肯定漏掉了一些简单的东西:
例如,假设在第一天晚上11:00(CDT -5)发生两次展示,以及第二天凌晨1:00发生一次展示(CDT)。如果您使用UTC (+0)进行查询,则会得到所有3个展示在第二天发生,而不是第一天发生两个展示和第二天发生一个展示。两个CDT时间都落在UTC的第二天。
这是我现在正在做的事情,我知道我肯定漏掉了一些简单的东西:
start = 30.days.ago
finish = Time.now
# if the users time zone offset is less than 0 we need to make sure
# that we make it all the way to the newest data
if Time.now.in_time_zone(current_user.timezone) < 0
start += 1.day
finish += 1.day
end
(start.to_date...finish.to_date).map do |date|
# get the start of the day in the user's timezone in utc so we can properly
# query the database
day = date.to_time.in_time_zone(current_user.timezone).beginning_of_day.utc
[ (day.to_i * 1000), Impression.total_on(day) ]
end
印象模型:
class Impression < ActiveRecord::Base
def self.total_on(day)
count(conditions: [ "created_at >= ? AND created_at < ?", day, day + 24.hours ])
end
end
我一直在看其他帖子,似乎可以让数据库为我处理很多繁重的工作,但是我尝试使用 AT TIME ZONE
或 INTERVAL
等内容时没有成功。
我现在的做法似乎非常混乱,我知道我肯定漏掉了一些显而易见的东西。谢谢任何帮助。