【问题标题】:How to deal with time zones in a Rails app with events如何在带有事件的 Rails 应用程序中处理时区
【发布时间】:2010-11-28 15:35:25
【问题描述】:

我有一个用于乐队的 Rails 应用程序。乐队可以导入他们的节目,这些节目都发生在不同的时区。将这些事件存储在 UTC 中似乎需要做大量的工作。我必须弄清楚创建的任何节目的时区,然后在向用户显示时转换回节目的本地时区。是否有一个简单的插件可以根据地理位置获取 UTC 偏移量?这可能会有所帮助,但是有没有人看到我应该在这里存储 UTC 的任何主要原因?我知道在 UTC 中存储时间戳可能是个好主意......但是乐队事件时间?

【问题讨论】:

    标签: ruby-on-rails timezone


    【解决方案1】:

    我正在开发类似的东西 - 一个包含事件列表的网站。在我的情况下,将时间标准化(以 UTC 为单位)很重要,因为我们需要担心宣布和打折的时间(即,活动何时出现在网站上以及打折链接何时出现),而不仅仅是显示事件开始时间(它本身并不关心它所在的时区)。

    使用类似于e.start.in_time_zone("#{e.venue.time_zone}") 的方式,从数据库中的 UTC 时间到给定场地的本地时间(即,在事件列表中显示本地时间)非常简单。我想不通的是在数据输入点获取本地时间,将其识别为需要转换为 UTC 的本地时间,而无需处理更改 Time.zone。

    我发现了一些有用的东西。看看这篇文章:http://steveluscher.com/archives/changing-a-times-zone-in-rails-keeping-the-same-local-representation。我在我的 config/initializers 目录中添加了一个新文件 (time_zone_support.rb)。以下是内容:

    module ActiveSupport
      class TimeWithZone
        def zone=(new_zone = ::Time.zone)
          # Reinitialize with the new zone and the local time
          initialize(nil, ::Time.__send__(:get_zone, new_zone), time)
        end
      end
    end
    

    这允许在控制台中进行以下操作:

    >> e.starts = Time.zone.parse("2010-09-12 10:00 am")
    => Sun, 12 Sep 2010 10:00:00 UTC +00:00
    >> e.starts.zone = e.time_zone
    => "Pacific Time (US & Canada)"
    >> e.starts
    => Sun, 12 Sep 2010 10:00:00 PDT -07:00
    >> e.save
    => true
    

    希望对你也有帮助!

    【讨论】:

    • 仅供参考,这不再有效,因为 get_zone 已从 Time 中删除
    • 这是我在 Rails 3.2.8 中使用的: def same_time_of_day_in_time_zone(zone = ::Time.zone) ActiveSupport::TimeWithZone.new(nil, ::Time.find_zone!(zone) , self) 结束
    【解决方案2】:

    您无需担心这里的 UTC,因为事件与它发生的时间和地点有关。如果有人从夏威夷前往旧金山参加晚上 8 点的演出,这并不意味着演出会在下午 4 点开始。因此,您可以存储简单的时间和位置,不用担心 TZ(因为大概乐队只有时间和位置表格)并将其存储在 db 中。

    就 Rails 而言,所有事件都将发生在它所在的 TZ 中,只是通过这个有趣的“位置”属性告诉读者事件确实在 1000 英里之外。这意味着它可以自己进行正常的自动 TZ 转换,但读者无法分辨。它将首先转换为乐队输入的时间。晚上 8 点+“洛杉矶”,晚上 10 点+“塔尔萨,OK。”

    这里的一个问题是节目是否通过互联网或类似的方式播出,地点与事件脱钩,您仍然可以执行上述操作,但让观众/潜在观众选择他们的拥有 TZ(或对其进行地理定位)并让应用在视图中显示时进行转换。

    【讨论】:

      【解决方案3】:

      一种方法是将它们全部存储在 utc 中,然后让用户决定他们想在哪个时区看到它们。

      【讨论】:

      • 我正要问为什么它有-1。然后我看到链接的页面是捷克语什么的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-11
      • 2020-11-16
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多