Преобразование времени из одного часового пояса в другое в Rails

Мои метки времени 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