【发布时间】:2012-12-20 20:16:46
【问题描述】:
通常我的 webapp 中有日期时间字段,这些字段由 Rails 作为 UTC 时间存储在 postgresql 数据库中。当我在网页上显示这些日期和时间时,它们会显示为当地时间,因为我有类似于以下代码的内容:
before_filter :set_time_zone
def set_time_zone
Time.zone = "Pacific Time (US & Canada)"
end
效果很好,除了现在我需要将其中一些 datetime 字段转换为数据库中的 date 字段(这很重要)。例如,我可能有学生开始日期的日志:
Log.create(at: began_at, student_id: student_id)
began_at 是一个 datetime 字段。我是否正确设置了 Time.zone 并不重要,at 字段是date,它将存储在 postgresql 中,可能是当地时间提前或落后 1 天。当我去显示那个日期时,它不会被转换为本地时间,这是有道理的......如果我没有存储时间,Ruby/Rails 怎么知道它是本地的哪一天?
我需要的是存储本地日期。所以我需要将began_at 转换为当地时间,然后再将其分配给at。在 Rails 的控制器中执行此操作的正确方法是什么?
我正在使用最新的稳定 Rails(现在是 3.2.9)
【问题讨论】:
-
我不建议存储本地日期。以 UTC 存储所有内容并根据用户所在的位置显示它:例如使用这个 gem:github.com/basecamp/local_time——其次,如果你想根据日期时间字段进行查询,那么你可能需要传入从客户端提取的时区,并以某种方式将其转换为 UTC。跨度>
标签: ruby-on-rails ruby ruby-on-rails-3 ruby-on-rails-3.2 rails-i18n