我必须显示过去 30 天内每天有多少次 api 调用给用户,以便构建一个漂亮的图表。到目前为止,我对此没有任何问题。需要注意的重要一点是,数据库和系统时区采用 UTC,但大多数用户位于太平洋时间 (GMT -8)。
为了获得按使用日期分组的 api 使用情况,我可以做类似的事情
ApiCall.
where(user_id: @user.id).
where("requested_at > ?", Time.zone.now.to_date - 30.days).
group("date(requested_at)").
select("count(*) as qty, date(requested_at) as requested_at").all
现在的问题是,位于加利福尼亚的用户的时间与位于英格兰的用户的时间大不相同,这就是我失败的地方。
一位用户在 2012 年 12 月 14 日 21:00:00 GMT -8 进行 API 调用,位于加利福尼亚州。数据库中的 API CALL 存储时间为 2012-12-14 05:00:00(因为它在 GMT 中,所以它增加了 8 小时)。
现在对于那个用户,如果我去查看我的日常使用情况,通过我所做的查询,它将显示我的 api 调用不是在 2012 年 12 月 14 日 21:00:00 进行的,因为它在数据库上存储为2012-12-14 05:00:00,对于用户而言,api 使用情况将显示他在第二天进行了该 api 调用,他会认为系统工作不正常。
简而言之,如何根据用户时区而不是数据库时区对 api 调用进行分组?