2009-06-03 7 views
14

Javascript auf meiner Seite speichert Client-UTC-Offset zum Cookie. Wie verwende ich diesen Cookie, um eine TimeZone zu erstellen und sie Time.zone zuzuordnen?Aktuelle Zeitzone in Rails setzen?

Ich brauche so etwas wie:

before_filter :set_time_zone 

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

der Ausnahme, dass der rechte Teil dieses Ausdrucks nicht funktioniert und ich bin nicht sicher, ob ich hier auf dem richtigen Weg bin. Ich verstehe es nicht.

Antwort

14

Hier ist die Arbeits gegoogelt Antwort:

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

Nur um klarzustellen, die Javascript-Teil:

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

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

+1

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

+2

@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. –

3

Wenn ich es in meinem User-Modell gespeichert habe es so einfach ist, wie diese

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

so vielleicht könnten Sie

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

tun, die nicht getestet sind, habe ich nie versucht, es zu tun aus ein Cookie, ich denke, es macht mehr Sinn, es im Benutzermodell zu speichern.

+0

Nein, ich muss es nicht im Benutzermodell speichern. Wie sieht Ihre current_user.time_zone aus? Ist es eine Schnur? – snitko

+1

Ja, nur mit den Rails in Zeitzone Zeug gebaut, so für meinen Benutzer in einer App wäre es nur "Sydney" – nitecoder

+0

Allgemein Zugriff auf Objekte wie Sitzung und Cookie in Model (M Teil von MVC) ist keine gute Praxis – yek

6

@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.

+0

Hey, ich weiß es eine lange Zeit .. aber ich mache das. Könntest du die letzte Zeile klären? Und müssen Sie nicht die Seite aktualisieren, sobald Sie den Cookie gesetzt haben, um die aktuelle Seite zu beeinflussen? –

+0

Die letzte Zeile legt die Zeitzone als globale Konfiguration für Ihre Anwendung fest. Wenn viele Personen Ihre Anwendung aus verschiedenen Zeitzonen ansprechen, ist dies möglicherweise nicht der beste Ansatz (im Vergleich zur Einstellung der Zeitzone für einen einzelnen Benutzer). Aber ja, Sie haben Recht, Sie müssten die Seite aktualisieren, damit der Server die Seite mit der aktualisierten Zeitzone darstellt, um zeitbezogene Änderungen zu sehen. – efatsi

+0

Hey, ich glaube, Time.zone ist threadsicher, und solange du es bei jeder Anfrage einstellst, denke ich nicht, dass zwischen Anfragen interferieren soll oder? Auch ich meinte eigentlich deine EDIT: Zeile, die davon redet, das Cookie-Zeug am Ende zu platzieren? –

Verwandte Themen