@snitko - Du bist Antwort groß für eine lange Zeit für mich gearbeitet. Wie @ Giovanni jedoch hervorhebt, berücksichtigt es in einigen Szenarien nicht die Sommerzeit, da es die erste verfügbare Zeitzone beim Minuten-Offset anzeigt. Ich habe eine einfache funktionierende Antwort gefunden, die DST berücksichtigt.
Kopf hier - http://site.pageloom.com/automatic-timezone-detection-with-javascript, es ist ein Javascript Zeitzonendetektor. Sie kopieren einfach den JavaScript-Code, der von der Website verlinkt ist (oder rechts here), in Ihre JavaScript-Dateien in Ihrer App (application.js funktioniert einwandfrei). Sie können die Zeitzone über ein Objekt mit dem Namen jstz
abrufen.
in application.html.erb Dann habe ich
<script type="text/javascript">
var timezone = jstz.determine();
document.cookie = 'time_zone='+timezone.name()+';';
</script>
Und in application_controller.rb, ich habe
before_filter :set_timezone
private
def set_timezone
Time.zone = cookies["time_zone"]
end
Und das ist alles, was Sie brauchen! Die Zeitzone ist für Ihre Rails-App richtig eingestellt.
EDIT: Es ist möglich, dass Sie den Javascript-Cookie-Einstellungscode nach Ihrem <\body>
Tag in application.html.erb aufgrund der unterschiedlichen Art und Reihenfolge der Javascript-Dateien geladen werden müssen.
Sie auch entfernen müssen möglicherweise, dass >>> if (! ($. Cookie ('Zeitzone'))) <<< Zustand, wie Sie Ihre Website-Besucher können reisen und dort ihren Zeitzonenwert aktualisieren müssen. – yek
Ein kleines Problem: Die 'TimeZone [-min.minutes]' gibt die erste verfügbare Zeitzone mit dem Offset 'min.minutes' zurück. Zum Beispiel für Tokyo gibt es Irkutsk zurück. Diese Methode würde also funktionieren, wenn Sie den Namen oder Code der Zeitzone nicht anzeigen müssen. – arkadiy
@arkadiy ist richtig, aber das ist nicht nur ein kleines Problem, weil Sie Zeitzonen bekommen können, die keine Sommerzeit (DST) beobachten. In diesem Fall ist das Ergebnis eine falsche Zeit. Außerdem 'new Date(). GetTimezoneOffset()' gibt den aktuellen Offset einschließlich DST zurück, aber die 'ActiveSupport :: TimeZone []' Auswahl erwartet die Standard Zeitzone Offset, so sollten Sie Ihre Javascript-Funktion [so] (http://bit.ly/timezone_js). Sie können [this thread] (https://github.com/potomak/tomatoes/issues/8#issuecomment-2167461) über das Problem sehen, wenn Sie mehr darüber erfahren möchten. –