如何为我的Rails应用程序提供通用时间支持?

时间:2012-05-07 11:31:45

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

我正在构建一个Rails应用程序,用户可以在其中发布他们知道的访谈详细信息。表单有一个输入字段访问时间,即日期时间选择器。我希望为此应用程序提供通用支持。

实际问题:

我们说我已在生产服务器中配置了IST时区。然后,如果来自日本的用户选择将在IST时区解析的访谈时间。结果将是不正确的访问时间。

显示正确的面试时间。

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

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

谢谢大家:)

如果问题不明确,请在问题下方添加评论。

2 个答案:

答案 0 :(得分:3)

我有类似的问题。我保留了默认的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生成选择字段。

答案 1 :(得分:1)

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