2

我有所有需要的时区信息,它会根据这个 railscast正确保存所有信息。一切都适用于所有正常目的,例如在表格中显示时间,但是我想知道如何将以下内容转换为current_users保存的时区。

我有一个每小时的通话总数:

Calls.count(:group => DATE_PART('hour', start_time), 
            :conditions => ["start_time BETWEEN ? AND ?", start, finish]

此查询提取在开始时间和结束时间之间一小时内进行的所有呼叫。唯一的事情是它在以UTC形式存储的数据库中拉回时间。我编写了自己的小转换方法,Time.now.utc_offset但意识到这行不通。将保存的用户time_zone与从数据库中下载的用户进行比较并添加utc_offset.

time_zone字符串形式存储在数据库东部时间(美国和加拿大)中。

解决这个问题的最佳方法是什么,我可以更改以将用户的偏移量保存在数据库中,但在我这样做之前,我宁愿看看是否有更简单的方法。

编辑
为了更清楚,查询返回小时哈希和计数。例如:

                Hour                       Count
                "5"                          20
                "6"                          15
                "7"                          35
                ...                          ...

小时作为 UTC 偏移小时返回,我需要将该数字转换为用户时区,例如,如果是东部时间(美国和加拿大),则循环遍历哈希并将 -4 添加到小时。

编辑 2
感谢安迪,我能够非常简单地解决这个问题。您要做的第一件事是将 Time 对象设置为当前用户的时区。所以:

Time.zone = @current_user.time_zone
=> "Eastern Time (US & Canada)

然后将当前用户的偏移量添加到哈希内的“小时”

hour + Time.now.in_time_zone.utc_offset / 3600

非常不言自明,但这会获取您之前设置的区域的时间,并以秒为单位找到 UTC 偏移量,这就是我们除以 3600 的原因。

4

2 回答 2

4

这有帮助吗?

t = TimeZone["Eastern Time (US & Canada)"]
t.utc_to_local(DateTime.now) #gives the local time

在我之前发帖的人删除了他的答案(这比我的答案好得多)。如果他把他的答案带回来,我会再次拿下我的。

于 2009-08-20T21:33:38.137 回答
0
scope :opened, where("date > '#{Time.now.in_time_zone}'")
scope :closed, where("date < '#{Time.now.in_time_zone}'")
于 2011-11-22T17:06:13.737 回答