Установить текущий 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.