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

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

我正在做类似的事情 – 一个包含事件列表的网站。 在我的情况下,重要的是将时间标准化(以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 

希望对你有所帮助!

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

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

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

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