如何使用事件处理Rails应用程序中的时区

时间:2009-09-15 23:54:40

标签: ruby-on-rails timezone

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

3 个答案:

答案 0 :(得分:4)

我正在做类似的事情 - 一个包含事件列表的网站。在我的情况下,重要的是将时间标准化(以UTC为单位),因为我们需要担心公告和待售时间(即,当事件出现在网站上以及何时出现销售链接时),而不仅仅是显示事件开始时间(它本身并不关心它所在的时区)。

从数据库中的UTC时间到给定地点的当地时间(即,在事件列表中显示当地时间)使用e.start.in_time_zone("#{e.venue.time_zone}")的内容非常简单。我无法弄清楚的是将数据输入点的本地时间识别为需要转换为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

希望对你有帮助!

答案 1 :(得分:1)

您无需担心此处的UTC,因为该事件与其发生的时间和地点有关。如果有人从夏威夷前往旧金山参加晚上8点的节目,那并不意味着节目将在下午4点开始播放。因此,您可以存储明确的时间和位置,不要担心TZ(因为可能是乐队只有时间和位置形式)并将其存储在数据库中。

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

这里的一个问题是节目是通过互联网播放还是类似的东西,其中位置与活动分离,你仍然可以在上面做,但让观众/潜在观众成员选择他们的拥有TZ(或地理定位它们)并让应用程序在视图中显示转换。

答案 2 :(得分:-1)

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