Rails和日期,默认情况下是否以UTC格式存储?

时间:2011-07-09 15:25:07

标签: ruby-on-rails ruby

我在轨道中处理日期和时区的最佳方式是什么?

Scenerio:我有客户在世界各地的网站上购买产品,当他们登录时,他们将能够选择他们来自哪个时区。

所以我相信我应该在UTC中存储数据库中的所有内容,然后在前端我应该将日期转换为用户设置的时区首选项。

他们是否有使用Ruby和Rails以及日期时间的任何问题?

我是rails的新手,所以我正在寻找如何正确处理这个问题的指导。

4 个答案:

答案 0 :(得分:11)

幸运的是,Rails几乎可以为你处理事情。正如其他人所指出的,日期由AR以UTC格式存储。如果您的用户表有time_zone字段,则可以执行以下操作:

# application.rb
config.time_zone = "Mountain Time (US & Canada)" # Default time zone

-

# application_controller.rb
before_filter :set_time_zone, :if => :logged_in?

protected
def set_time_zone
  Time.zone = current_user.time_zone if current_user.time_zone
end

所有日期时间都应显示在视图中的适当时区。

我有一个不喜欢使用默认时区的制作应用,但我不记得它正在运行哪个版本的Rails / Ruby。

答案 1 :(得分:1)

好的,请查看您的config/application.rb文件。

你应该找到注释行:

# Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
# Run "rake -D time" for a list of tasks for finding time zone names. Default is UTC.
# config.time_zone = 'Central Time (US & Canada)'

因此默认为UTC,但您可以设置任何需要的内容。

答案 2 :(得分:1)

是的,他们是。在应用程序中,每当您为用户显示日期或时间时,您需要的只是添加时区偏移(例如:GMT + 1的date + 1.hour)。请记住,您也需要照顾夏令时。为提高效率,请考虑在用户表中添加2列:timezone和time_offset。然后你会在每个案例中做类似

的事情
= @order.created_at + session[:user].time_offset

而不是总是检查配置文件中设置的每个时区的偏移量。

答案 3 :(得分:0)

我找到了

rake time:zones:all

真的很有用。它显示了一个偏移列表,然后显示了区域名称字符串。例如:

* UTC +12:00 * 
Auckland 
Fiji
Kamchatka
Magadan
Marshall Is.
Solomon Is.
Wellington

我在application.rb中需要以下(根据“Mountain Time(美国和加拿大)”的默认时区字符串不直观):

config.time_zone = 'Wellington'