我在轨道中处理日期和时区的最佳方式是什么?
Scenerio:我有客户在世界各地的网站上购买产品,当他们登录时,他们将能够选择他们来自哪个时区。
所以我相信我应该在UTC中存储数据库中的所有内容,然后在前端我应该将日期转换为用户设置的时区首选项。
他们是否有使用Ruby和Rails以及日期时间的任何问题?
我是rails的新手,所以我正在寻找如何正确处理这个问题的指导。
答案 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'