Установить текущий Time.zone в Rails?

Javascript на моей странице сохраняет смещение UTC клиента в файл cookie. Как использовать этот файл cookie для создания TimeZone и назначить его Time.zone?

Мне нужно что-то вроде:

before_filter :set_time_zone

def set_time_zone
  Time.zone = ActiveSupport::TimeZone.new('my timezone', cookies[:timezone])
end

за исключением того, что правая часть этого выражения не работает, и я не уверен, что я пойду правильно здесь. Не получается.

Ответы

Ответ 1

Здесь рабочий ответ в googled:

min = cookies[:timezone].to_i
Time.zone = ActiveSupport::TimeZone[-min.minutes]

Просто, чтобы было ясно, часть javascript:

if(!($.cookie('timezone'))) {
  current_time = new Date();
  $.cookie('timezone', current_time.getTimezoneOffset(), { path: '/', expires: 10 } );
} 

Ответ 2

@snitko - вы отвечаете за меня долгое время. Однако, как отметил @Giovanni, в некоторых сценариях не учитывается переход на летнее время, так как он извлекает первый часовой пояс с учетом минутного смещения. Я нашел простой рабочий ответ, который учитывает DST.

Направляйтесь сюда - http://site.pageloom.com/automatic-timezone-detection-with-javascript, это детектор часовых поясов javascript. Вы просто скопируете код javascript, связанный с веб-сайта (или правой здесь) в одно из ваших javascript файлов приложения (application.js отлично работает). Это позволяет вам получить часовой пояс через объект с именем jstz.

Затем в application.html.erb у меня есть

<script type="text/javascript">

  var timezone = jstz.determine();
  document.cookie = 'time_zone='+timezone.name()+';';

</script>

И в application_controller.rb у меня есть

before_filter :set_timezone 

private
def set_timezone
  Time.zone = cookies["time_zone"]
end

И это все, что вам нужно! Часовой пояс установлен правильно для вашего приложения Rails.

EDIT: возможно, вам нужно поместить код настройки cookie javascript после тэга <\body> в application.html.erb из-за загрузки и загрузки javascript по-разному.

Ответ 3

Когда он хранится в моей модели User, он прост, как этот

def set_time_zone
  Time.zone = current_user.time_zone unless current_user.blank?
end

возможно, вы могли бы сделать

def set_time_zone
  Time.zone = cookies[:timezone]
end

Непроверенный, я никогда не пытался сделать это из файла cookie, я думаю, что имеет смысл хранить его в модели User.