Часовой пояс с рельсами 3 - PullRequest
       9

Часовой пояс с рельсами 3

28 голосов
/ 06 декабря 2010

У меня довольно распространенная проблема, но по какой-то причине я перепробовал все предложения в Интернете, и ни одно из них не работает.

Я установил часовой пояс в конфигурации на «EST»

config.time_zone = 'Eastern Time (US & Canada)'

Но когда время показывается на экране, оно продолжает показывать время UTC, которое хранится в БД. Я попробовал отладчик и вот вывод

(rdb:1) Time.zone 
#<ActiveSupport::TimeZone:0x1061f4760 @utc_offset=nil, @current_period=nil, @name="Eastern Time (US & Canada)", @tzinfo=#<TZInfo::TimezoneProxy: America/New_York>>
(rdb:1) Order.first.placed_at
Fri Jan 01 15:00:00 UTC 2010

Обновление: Вот еще один пользователь с таким же вопросом Часовой пояс Rails указан неверно

Ответы [ 4 ]

36 голосов
/ 06 декабря 2010

Попробуйте in_time_zone.Например

>> Time.now
=> Sun Dec 05 21:34:45 -0500 2010
>> Time.zone
=> #<ActiveSupport::TimeZone:0x1033d97b8 @name="Pacific Time (US & Canada)", @tzinfo=#<TZInfo::DataTimezone: America/Los_Angeles>, @utc_offset=-28800, @current_period=nil>
>> Time.now.in_time_zone
=> Sun, 05 Dec 2010 18:34:54 PST -08:00

В вашем случае вы хотите Order.first.placed_at.in_time_zone.

11 голосов
/ 11 февраля 2013

Если вы хотите установить другой часовой пояс для разных пользователей вашего приложения , убедитесь, что вы используете round_filter вместо фильтра до, чтобы изменить Time.zone. Что-то связанное с тем, как Time.zone просачивается в другие потоки, и, таким образом, другие пользователи могут создавать часовой пояс, который им не следует. Из этого блога: http://ilikestuffblog.com/2011/02/03/how-to-set-a-time-zone-for-each-request-in-rails/

в application_controller.rb:

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

Я также счел полезным использовать вспомогательный метод формы time_zone_select , когда пользователи могут изменять свой часовой пояс. Если бы вы назвали свое поле: time_zone, вы бы использовали его следующим образом:

f.time_zone_select(:time_zone)

И, наконец, это выглядит довольно круто. Автоопределение и установка часового пояса с помощью JavaScript . Вот жемчужина рельсов, которую нужно добавить к конвейеру активов: https://github.com/scottwater/detect_timezone_rails и сопровождающее сообщение в блоге: http://www.scottw.com/automated-timezone-detection

2 голосов
/ 15 марта 2011

Убедитесь, что ваш ActiveRecord::Base.time_zone_aware_attributes соответствует действительности.

0 голосов
/ 06 ноября 2012

Я думаю, что вы описываете эту ошибку - https://github.com/rails/rails/issues/6816

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...