【问题标题】:How to give universal time support to my Rails application?如何为我的 Rails 应用程序提供通用时间支持?
【发布时间】:2012-05-07 11:31:45
【问题描述】:

我正在构建一个 Rails 应用程序,用户可以在其中发布他们知道的面试详细信息。表单有一个输入字段面试时间,即日期时间选择器。我想为这个应用程序提供普遍支持。

实际问题:

假设我在生产服务器中配置了 IST 时区。那么如果来自日本的用户选择了一个面试时间,它将在 IST 时区进行解析。结果将是一个错误的面试时间。

显示正确的面试时间。

1.我需要从用户那里获取时区吗?(可能是一个选择框)

2.有没有其他选项可以自动检测时区?

谢谢大家:)

如果有不清楚的地方,请在问题下方添加评论。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 datetime


    【解决方案1】:

    我也有类似的问题。我保留了默认的 rails 配置,因此所有时间都以 UTC 格式存储在数据库中,并且我使用了来自 ActiveSupport::TimeZone 的以下方法:

    • 当我需要保存表单中的日期时,我使用local_to_utc 将日期从本地转换为 UTC:

      ActiveSupport::TimeZone[my_timezone].local_to_utc(date)
      
    • 当我需要显示数据库中的日期时,我使用了

      ActiveSupport::TimeZone[my_timezone].utc_to_local(date)
      

    这样,保存在数据库中的所有日期都是 UTC,但由用户以本地时间处理,每个用户的时间可能不同。您可以将时区存储在User 级别(数据库中的string 字段),和/或使用select helper 生成选择字段。

    【讨论】:

      【解决方案2】:

      Baldrick 的回答是正确的——您应该将时间存储在 UTC 中,并将每个用户的时区存储在用户记录中。

      此外,用户经常希望看到的是该位置的当地时间。

      为此,当您存储 UTC 时间时,还要存储创建事件的用户的时区。

      所有这一切的棘手部分是 MySQL 和许多其他数据库不存储带有日期/时间的时区。因此,时区信息会丢失,除非您将其明确存储在不同的字段中。

      因此,您的数据库中需要两个字段:

      event_time_utc: Datetime, # UTC timezone for when the event happened
      event_timezone: string # the timezone of where the event happened
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        • 2016-10-15
        • 1970-01-01
        相关资源
        最近更新 更多