【问题标题】:ruby on rails converting to users time zoneruby on rails 转换为用户时区
【发布时间】:2010-11-21 11:30:23
【问题描述】:

我拥有所需的所有时区信息,它会根据this 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 的原因。

【问题讨论】:

  • 你能澄清一下这个问题吗?您只想指定用户时区的开始/结束时间,还是只想在查询完成后将 UTC 时间转换为用户的时区?
  • 查询完成后将UTC时间转换为用户所在时区

标签: ruby-on-rails utc


【解决方案1】:

这有帮助吗?

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

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

【讨论】:

  • 这对我来说可能已经足够了,我会更新一点。
  • 这很有帮助。在您向我展示我可以使用用户时区设置时间对象后,我花了十分钟才弄清楚。查看我的编辑以了解我做了什么。语法是唯一真正不同的东西。
【解决方案2】:
scope :opened, where("date > '#{Time.now.in_time_zone}'")
scope :closed, where("date < '#{Time.now.in_time_zone}'")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-07
    • 2014-07-02
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    相关资源
    最近更新 更多