【问题标题】: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