Відповіді:
Використовуйте метод 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")
коротше
Хоча це старе питання, варто щось згадати. У попередній відповіді пропонується скористатися pre_filter, щоб тимчасово встановити часовий пояс.
Ви ніколи не повинні цього робити, тому що Time.zone зберігає інформацію в потоці, і вона, ймовірно, просочиться до наступного запиту, обробленого цим потоком.
Натомість слід скористатися навколо_фільтром, щоб переконатися, що 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)"
Тепер усі записи, які ви витягуєте, будуть знаходитися в тому часовому поясі. Якщо вам потрібні різні часові пояси, скажімо, на основі часового поясу користувача, ви можете змінити його за допомогою попереднього фільтра у вашому контролері.
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)