我在我的布局中使用此JavaScript函数在Rails中设置本地时区:
<script type="text/javascript" charset="utf-8">
<% unless session[:timezone_offset] %>
$.ajax({
url: '/main/timezone',
type: 'GET',
data: { offset: (new Date()).getTimezoneOffset() }
});
<% end %>
</script>
这是接收函数:
# GET /main/timezone AJAX
#----------------------------------------------------------------------------
def timezone
#
# (new Date()).getTimezoneOffset() in JavaScript returns (UTC - localtime) in
# minutes, while ActiveSupport::TimeZone expects (localtime - UTC) in seconds.
#
if params[:offset]
session[:timezone_offset] = params[:offset].to_i * -60
ActiveSupport::TimeZone[session[:timezone_offset]]
end
render :nothing => true
end
然后我在会话中有偏移量,所以我做了这样的事情来表示时间:
<%= (@product.created_at + session[:timezone_offset]).strftime("%m/%d/%Y %I:%M%p") + " #{ActiveSupport::TimeZone[session[:timezone_offset]]}" %>
在Rails 3中所有这些都是必需的吗?我认为前两个代码块可能是,但第三个似乎有点过分......
答案 0 :(得分:1)
您可以设置当前时区,并记住所有操作。它可以在某个非常高的控制器的before_filter中完成,比如AppController。例如
class ApplicationController < ActionController::Base
before_filter :set_zone_from_session
private
def set_zone_from_session
# set TZ only if stored in session. If not set then the default from config is to be used
# (it should be set to UTC)
Time.zone = ActiveSupport::TimeZone[session[:timezone_offset]] if session[:timezone_offset]
end
end
可能第一眼看上去并不好看 - 但它会影响所有观点,所以不需要在那里进行任何转换。