Answers:
使用DateTime类的in_time_zone方法
Loading development environment (Rails 2.3.2)
>> now = DateTime.now.utc
=> Sun, 06 Sep 2009 22:27:45 +0000
>> now.in_time_zone('Eastern Time (US & Canada)')
=> Sun, 06 Sep 2009 18:27:45 EDT -04:00
>> quit
因此,对于您的特定示例
Annotation.last.created_at.in_time_zone('Eastern Time (US & Canada)')
created_at.in_time_zone("EST")
较短
尽管这是一个老问题,但值得一提。在上一个答复中,建议使用before_filter临时设置时区。
您永远不要这样做,因为Time.zone将信息存储在线程中,并且该信息很可能会泄漏到该线程处理的下一个请求中。
相反,您应该使用around_filter确保请求完成后重置Time.zone。就像是:
around_filter :set_time_zone
private
def set_time_zone
old_time_zone = Time.zone
Time.zone = current_user.time_zone if logged_in?
yield
ensure
Time.zone = old_time_zone
end
将您的时区设置为东部时间。
您可以在config / environment.rb中设置默认时区
config.time_zone = "Eastern Time (US & Canada)"
现在,您提取的所有记录都将在该时区中。如果您需要不同的时区,请说说基于用户时区,您可以在控制器中使用before_filter进行更改。
class ApplicationController < ActionController::Base
before_filter :set_timezone
def set_timezone
Time.zone = current_user.time_zone
end
end
只要确保您将所有时间都以UTC格式存储在数据库中,一切都会变得很美好。
Time.zone=
是线程安全的github.com/rails/rails/blob/master/activesupport/lib/…。
now.in_time_zone(3)