@snitko - ты ответ работал большой для меня в течение длительного времени. Однако, как отметил @Giovanni, в некоторых сценариях не учитывается переход на летнее время, так как он извлекает первый часовой пояс с учетом минутного смещения. Я нашел простой рабочий ответ, который учитывает DST.
Голова здесь - http://site.pageloom.com/automatic-timezone-detection-with-javascript, это детектор времени javascript. Вы просто скопируете код javascript, связанный с веб-сайта (или правой here) в свои файлы 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.
Вы также, возможно, потребуется удалить, что >>> если (! ($. печенье ('часовой пояс'))) <<< состояние, как ваши посетители сайта могут путешествия, и там нужно обновить их значение часового пояса. – yek
Одна небольшая проблема: 'TimeZone [-min.minutes]' возвращает первый доступный часовой пояс со смещением 'min.minutes'. Например, для Токио он возвращает Иркутск. Таким образом, этот метод будет работать, если вам не нужно отображать имя часового пояса или код. – arkadiy
@arkadiy прав, но это не только проблема, потому что вы можете получить часовые пояса, которые не соблюдают летнее время (DST). В этом случае результат - неправильное время. Кроме того, 'new Date(). GetTimezoneOffset()' возвращает текущее смещение, включая DST, но выбор 'ActiveSupport :: TimeZone []' ожидает стандартного смещения часового пояса, поэтому вы должны обновить функцию javascript [как это] (http://bit.ly/timezone_js). Вы можете увидеть [эту тему] (https://github.com/potomak/tomatoes/issues/8#issuecomment-2167461) о проблеме, если хотите узнать об этом больше. –