2009-09-15 40 views
0

我有一个Rails应用程序用于乐队。乐队可以导入他们的节目,这些节目都发生在不同的时区。用UTC来存储这些事件似乎有很多工作要做。我必须确定所创建的任何节目的时区,然后在显示给用户时转换回节目的本地时区。有一个简单的插件来获取基于地理定位的UTC偏移量吗?这可能会有所帮助,但是有没有人看到我应该以UTC存储的主要原因?我知道以UTC存储时间戳可能是一个好主意......但是乐队活动时间?如何在事件中处理Rails应用程序中的时区

回答

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。我添加了一个新文件(time_zone_support.rb)到我的config/initializers目录。以下是内容:

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

仅供参考,这不再有效,因为get_zone已从时间 – 2012-01-30 16:59:03

+2

中删除这就是我在Rails 3.2.8中使用的: def same_time_of_day_in_time_zone(zone = :: Time.zone) ActiveSupport :: TimeWithZone.new(nil,:: :Time.find_zone!(zone),self) end – 2012-10-29 21:32:47

-1

一个办法做到这一点是它们都存储在UTC,然后让用户决定他们希望看到他们在什么时区。

+0

我想问为什么这有-1。然后我看到链接页面是捷克语或其他东西。 – Dan 2014-01-20 02:01:58

1

你不需要在这里担心UTC,因为该事件被捆绑到它发生的时间和地点。如果有人从夏威夷前往旧金山参加晚上8点的节目,这并不意味着节目将在下午4点开始。所以,你可以存储简单的时间和位置,不必担心TZ(因为大概只有时间和位置的形式)并将其存储在数据库中。

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

这里的一个问题是,节目是通过互联网播放的还是类似的,其中的位置与事件分离,在这种情况下你仍然可以进行上述操作,但让观众/潜在观众成员选择他们自己的TZ(或地理定位他们),并让应用程序在视图中显示时进行转换。

相关问题