Ответы:
Используйте метод in_time_zone класса DateTime
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/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Тогда вы можете сотовый
Annotation.last.created_at.in_time_zone
чтобы получить время в указанном часовом поясе.
Установите часовой пояс на восточное время.
Вы можете установить часовой пояс по умолчанию в 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)