Rails 处理用户特定时区

Rails Handling User specific timezone

我想在当前用户登录的时区显示其他用户创建的日期时间。

遇到过

config.time_zone = 'Central Time (US & Canada)' and
config.active_record.default_timezone = :local

但是我如何将它设置为当前登录用户的时区,并且它会保存其他用户在他们的时区保存的日期时间并查看到他们特定时区的其他用户?

在您的 ApplicationController 中考虑此代码。

around_action :switch_time_zone, :if => :current_user

def switch_time_zone(&block)
  Time.use_zone(current_user.time_zone, &block)
end

它用 Time.use_zone( current_user.time_zone ) 包装当前请求,这将应用的当前时区设置为整个请求的当前用户时区,并且应该使您的所有时间都在当前用户的时区中呈现时区,除非专门转换为时区。

我们有一个亚欧互动网站。我们以 UTC 时间保存所有内容

然后我们只给出用户时区的时间。

=comment.created_at.in_time_zone

首先,您需要在客户端确定用户的时区并将其传递给控制器​​。您可以在 cookie 中设置它:

jQuery(function() {
  var tz = jstz.determine();
  $.cookie('timezone', tz.name(), { path: '/' });
});

然后在您的应用程序控制器中:

class ApplicationController < ActionController::Base
  around_filter :set_user_time_zone

  private

  def set_user_time_zone
    timezone = Time.find_zone(cookies[:timezone])
    Time.use_zone(timezone) { yield }
  end
end

使用这个Gemhttps://github.com/basecamp/local_time

<%= local_time(@time.created_at) %>

你只需要像这样传递对象,它就会呈现登录用户的本地时间。不需要获取当前用户的本地时区。让时间渲染的很平静:P

class ApplicationController < ActionController::Base
  around_filter :set_time_zone

  def set_time_zone
    if logged_in?
      Time.use_zone(current_user.time_zone) { yield }
    else
      yield
    end
  end
end

http://api.rubyonrails.org/v4.2.5.2/classes/Time.html#method-c-zone-3D