2009-08-20 13 views
2

Ich habe alle Zeitzone Informationen, die benötigt wird, und es speichert alle Informationen korrekt nach this railscast. Alles funktioniert gut für alle normalen Zwecke wie die Anzeige der Zeit in einer Tabelle, aber ich frage mich, wie ich die folgenden in die gespeicherte Zeitzone current_users konvertieren kann.ruby ​​on rails Konvertierung in Benutzer Zeitzone

Ich habe eine die Gesamtzahl der Anrufe findet stündlich:

Calls.count(:group => DATE_PART('hour', start_time), 
      :conditions => ["start_time BETWEEN ? AND ?", start, finish] 

Diese Abfrage in allen alle Anrufe zieht, die in einer Stunde zwischen Start- und Zielzeit gemacht wurden. Die einzige Sache ist, dass es die Zeit in der Datenbank zurückzieht, die als UTC gespeichert wird. Ich schrieb meine eigene kleine Umwandlungsmethode mit Time.now.utc_offset, aber erkannte, dass das nicht funktionieren würde. Was wäre eine gute Möglichkeit, die gespeicherten Benutzer time_zone mit dem zu vergleichen, was aus der Datenbank kommt, und fügen Sie die utc_offset hinzu.

Die time_zone wird als String in der Datenbank Eastern Time (US & Kanada) gespeichert.

Was ist der beste Weg dies herauszufinden, ich kann ändern, um den Offset des Benutzers in der Datenbank zu speichern, aber bevor ich gehe, würde ich lieber sehen, ob es einen einfacheren Weg gibt.

bearbeiten
mehr klar sein, gibt die Abfrage einen Hash von Stunden und die Zählung. So zum Beispiel:

   Hour      Count 
       "5"       20 
       "6"       15 
       "7"       35 
       ...       ... 

Die Stunde kommt zurück als UTC Stunde versetzt, muss ich diese Ziffer auf die Benutzer Zeitzone konvertieren, so zum Beispiel, wenn es Eastern Time (USA und Kanada), die Sie Schleife durch der Hash und add -4 zu der Stunde.

Edit 2
Dank Andy konnte ich dies ziemlich einfach herauszufinden. Das erste, was Sie tun möchten, ist das Zeitobjekt auf die Zeitzone des aktuellen Benutzers zu setzen. Also:

Time.zone = @current_user.time_zone 
=> "Eastern Time (US & Canada) 

hinzufügen dann den aktuellen Benutzers versetzt zur „Stunde“ in der Hash-

hour + Time.now.in_time_zone.utc_offset/3600 

ziemlich selbsterklärend, aber das wird die Zeit der Zone, die Sie zuvor festgelegt und findet die UTC Versatz in Sekunden, deshalb teilen wir uns durch 3600.

+1

Können Sie die Frage ein wenig klären? Möchten Sie nur die Start-/Endzeiten in Bezug auf die Zeitzone des Benutzers angeben oder möchten Sie nur eine UTC-Zeit in die Zeitzone des Benutzers nach der Abfrage konvertieren? – klochner

+1

Konvertieren Sie die UTC-Zeit in die Zeitzone des Benutzers nach der Abfrage – Ryan

Antwort

4

Hilft das?

t = TimeZone["Eastern Time (US & Canada)"] 
t.utc_to_local(DateTime.now) #gives the local time 

Wer vor mir gepostet hat, löschte seine Antwort (es war viel besser als meine Antwort). Wenn er seine Antwort zurückbringt, nehme ich meine wieder runter.

+0

Dies könnte genug für mich zu gehen, werde ich ein wenig aktualisieren. – Ryan

+1

Das hat sehr geholfen. Nimm mir zehn Minuten, um herauszufinden, nachdem du mir gezeigt hast, dass ich ein Zeitobjekt mit der Zeitzone des Benutzers einstellen kann. Sehen Sie meine Bearbeitung, um zu sehen, was ich getan habe.Die Syntax ist das einzige, was wirklich anders ist. – Ryan

0
scope :opened, where("date > '#{Time.now.in_time_zone}'") 
scope :closed, where("date < '#{Time.now.in_time_zone}'")