【问题标题】:Row based Time Zones in Rails 2.3.4Rails 2.3.4 中基于行的时区
【发布时间】:2009-10-05 01:24:20
【问题描述】:

处理以下情况的最佳方法是什么:

我们有创建“事件”的“管理员”。这些事件可以是全国性的,即:不同的时区。截至目前,有一个包含当前美国时区列表的选择菜单。数据库表中有一个对应的列,用于选择的时区。这样管理员就可以选择东部时间下午 5 点、太平洋时间下午 5 点等。而不是试图找出格林威治标准时间的等值。

应用程序根据 environment.rb 文件使用 UTC 作为默认时区。

如果管理员选择“东部时间(美国和加拿大)”,则所选日期戳仍保存为 UTC(或应用默认值)。我需要在上面选择的时间(包括时区)之前未显示事件的情况下执行查询。

由于事件需要自己的时区,数据应该如何保存? 我最初认为我需要在 Rails 保存值之前欺骗它,所以它保存了时区的 UTC 偏移量。

这将在 before_save 和 after_find 模型方法中处理。但它似乎不起作用,或者我错过了一些东西..

【问题讨论】:

    标签: ruby-on-rails timezone row


    【解决方案1】:

    你错过了一个简单的事实。时间是万能的。 UTC 下午 1:00 在任何地方都是 UTC 下午 1:00。您甚至不需要为每个事件存储 time_zone。您只需要让管理员选择它即可更轻松地输入时间。就后端而言,它始终采用 UTC。您当然可以从不同的时区输入时间,然后输出到不同的时区,但无论您如何扭曲它,它仍然是相同的“伦敦下午 1:00”。因此,当用户查看事件时,您可以简单地执行 event_date

    但是,如果观察用户实际上与事件处于不同的时区,并且您希望在用户的本地时区显示事件日期,那么您可以让用户选择他们的本地时区,并将其存储在 users 表中。然后在您的ApplicationController 上的before_filter 中,您可以这样做:

    class ApplicationController < ActionController::Base
      before_filter :set_time_zone
    
      private
      def set_time_zone
        Time.zone = current_user.time_zone if current_user
      end
    end
    

    那么每个来自数据库的时间值(例如event.date)都会自动转换到用户的家乡时区。

    也许我误解了这个问题。 :) 告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多