Мои метки времени created_at
сохраняются в формате UTC:
>> Annotation.last.created_at
=> Sat, 29 Aug 2009 23:30:09 UTC +00:00
Как мне преобразовать один из них в "Восточное время (США и Канада)" (с учетом летнего сбережения)? Что-то вроде:
Annotation.last.created_at.in_eastern_time
Ответ 1
Использовать метод 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)')
Ответ 2
Хотя это старый вопрос, стоит упомянуть что-то. В предыдущем ответе он предложил использовать параметр before_filter, чтобы временно установить часовой пояс.
Вы должны никогда, никогда делать это, потому что Time.zone хранит информацию в потоке и, вероятно, будет утечка в следующий запрос, обрабатываемый этим потоком.
Вместо этого вы должны использовать round_filter, чтобы убедиться, что Time.zone reset после завершения запроса. Что-то вроде:
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
Подробнее об этом здесь
Ответ 3
Если вы добавите это в свой /config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Затем вы можете использовать ячейку
Annotation.last.created_at.in_time_zone
чтобы получить время в указанном часовом поясе.
Ответ 4
Установите часовой пояс в Восточное время.
Вы можете установить часовой пояс по умолчанию в 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, и все будет хорошо.
Ответ 5
Если вы настроите /config/application.rb
config.time_zone = 'Eastern Time (US & Canada)'
Time.now.in_time_zone
DateTime.now.in_time_zone