以UTC格式保存日期时间,在Rails的用户时区中查看/查询?

Lan*_*ard 1 timezone ruby-on-rails

在一个区域中保存时间并在另一个区域中查看它们的标准是什么?我有这个environment.rb:

config.time_zone = 'UTC'
Run Code Online (Sandbox Code Playgroud)

但我想渲染它,并在其时区中执行诸如"今天创建的所有帖子"之类的查询,其中beginning_of_day以时区而不是UTC返回当天的开头.rails是否已在后台处理转换?

这是问题所在:

@now = Time.now
 => Wed Jan 26 09:50:04 -0600 2011 
User.count(:conditions => ["created_at > ?", @now])
  SQL (1.3ms)   SELECT count(*) AS count_all FROM `users` WHERE (created_at > '2011-01-26 09:50:04') 
 => 1 
@now = Time.now.utc
 => Wed Jan 26 15:50:10 UTC 2011 
User.count(:conditions => ["created_at > ?", @now])
  SQL (1.2ms)   SELECT count(*) AS count_all FROM `users` WHERE (created_at > '2011-01-26 15:50:10') 
 => 0 
Run Code Online (Sandbox Code Playgroud)

zet*_*tic 6

ActiveSupport具有内置方法,可在任何时区显示时间值.通常,您time_zone需要在User模型中添加一列,并将其设置为用户的首选区域.

@user.update_attribute(:time_zone,'Eastern Time (US & Canada)')
Run Code Online (Sandbox Code Playgroud)

然后在显示时间值时,将区域设置为用户的区域.

Time.zone = @user.time_zone
Time.zone.now # shows current time according to @user.time_zone
Run Code Online (Sandbox Code Playgroud)

一种方法是设置它,ApplicationController以便为每个请求完成:

class ApplicationController < ActionController::Base
  before_filter :set_time_zone

  def set_time_zone
    Time.zone = current_user.time_zone if current_user
  end
end
Run Code Online (Sandbox Code Playgroud)

注意:请参阅ActiveSupport :: TimeWithZone下的API