2009-07-15 10 views
1

Ich habe mir die Haare ausgezogen, um mit Time in Rails zu arbeiten. Grundsätzlich muss ich die gesamte Zeitausgabe (sowohl Core als auch ActiveSupport) auf die lokale Zeit des Servers einstellen - keine GMT, keine UTC, usw. Ich habe verschiedene Posts gesehen, die sich auf Time beziehen, aber sie beinhalten normalerweise jemanden, den man einstellen muss jeder Benutzer. Meins ist nicht annähernd so komplex, ich möchte einfach Konsistenz, wenn ich irgendein Zeitobjekt verwende. (Ich würde auch schätzen, dass ich nicht alle 3 Sekunden Fehler erhalte und mir sagt, dass ich kein Fixnum (oder irgendeinen anderen Typ) in String konvertieren kann - es ist Ruby, mach es einfach!)Wie arbeite ich mit Time in Rails?

Ich schein auch zu bekommen drastisch andere Zeiten für Time.new vs ActiveSupport 1.second.ago. Wie auch immer, hat jemand irgendwelche Qualitätsvorschläge bezüglich der Arbeit mit Time in Rails?

Antwort

1

Wenn Sie möchten, dass Zeitobjekte konsistent sind, warum nicht bei UTC bleiben? Ich habe gerade versucht Time.new und 1.second.ago mit Skript/Konsole und ich bekomme die gleiche Ausgabe (geben oder nehmen Sie eine Sekunde für die Eingabe des Befehls). Wie machst du es?

+0

Ich entschuldige mich. Du hast Recht. Die zurückgegebenen * Informationen sind identisch. Ich habe jedoch Fehler beim Ausdruck der Werte in Strings.Conversions "to_i" und wieder zurück werden durcheinandergeworfen und verrechnet. Wie ich schon sagte, ich will nicht UTC und ich möchte nicht ständig umwandeln (wie ich es an vielen Orten benutze). Ich möchte einfach alle Times als lokale Serverzeit zurückgeben. Danke –

1

Definieren Sie in Ihren Initialisierern die Formate, die Sie verwenden möchten.

ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:default => '%m/%d/%Y %H:%M') 
ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS.merge!(:my_special_format => '%H:%M %p') 

Wenn Sie dann ein Time-Objekt drucken möchten, funktioniert es wie im folgenden Beispiel. Beachten Sie, dass das Zeitobjekt in meiner Konsole meiner Zeitzone bereits bekannt ist. Ich mache hier keine magischen Transformationen.

>> t = Time.now 
=> Wed Jul 15 18:47:33 -0500 2009 
>> t.to_s 
=> "07/15/2009 18:47" 
>> t.to_s(:my_special_format) 
=> "18:47 PM" 

Aufruf Time # to_s verwendet das: Standardformat, oder Sie können im Namen des Formats übergeben Sie lieber, wie ich mit tat verwenden: my_special_format.

Sie können die verschiedenen Optionen zum Formatieren eines Time-Objekts here sehen.

+0

Nur ein kurzer Kommentar für andere, die diese Frage finden, wie ich. –

0

Wenn Sie nicht jede Benutzerzeiteinstellung speichern möchten, ist die einzige Lösung, Javascript-Zeitsystem zu verwenden, da es auf Benutzerclientzeit arbeitet. Zum Beispiel habe ich eine Anwendung, die jedes Mal, wenn Benutzer es versuchen, die App wird einige Beispieldaten mit jeder Daten haben einen anfänglichen Datumswert "heute" erstellen. Auf den ersten Blick verwirrte es mich sehr, weil mein Host-Server in Australien ist und viele Benutzer im westlichen Teil sind, also ist der ursprüngliche Datumswert nicht "heute", sondern "gestern" wegen des anderen Zeitbereichs.

Nach ein paar Tagen Kopfschmerzen habe ich endlich die Entscheidung, nur JavaScript-System zu verwenden und es in den Link, so wenn Benutzer klicken Sie auf den "Jetzt versuchen" Link wird es auch heute Datum Wert enthalten.

<% javascript_tag do -%> 
    var today = new Date(); 
    $("trynow").href = "<%= new_invitation_path %>?today=" + today.toLocaleString(); 
<% end -%> 
+0

Danke dafür. Es geht mir jedoch nicht darum, die Zeit mit den Menschen abzustimmen. Mein Problem besteht darin, dass die Time-Objekte ähnlich formatierte Werte für die Anzeige/den Druck ausgeben. Es ist mir egal, in welcher Zeitzone Menschen sind. Ich habe es mit Daten zu tun, die auf dem gleichen Server wie die Anwendung geloggt werden, sodass ich nur die Zeit brauche, um auf dem Server konsistent zu sein - im Einklang mit seinen eigenen lokalen Daten . Das heißt, mein Problem war, dass ActiveSupport die UTC-formatierte Zeit und Time die lokal formatierte Zeit zurücksendet. Ich brauche die ganze Zeit Server-lokal. Danke noch einmal. –

0

Fügen Sie den folgenden zu config/environment.rb Zeit richtig und konsequent die ganze Zeit im Rahmen von Rails zu behandeln. Es ist wichtig zu wissen, dass es Ihre Zeiten in UTC in der Datenbank speichert - aber das ist was Sie wollen - die Konvertierung wird automatisch durchgeführt.

config.time_zone = 'Pacific Time (US & Canada)' 

Sie können rake time:zones:local von Rails-Stammverzeichnis, um eine Liste der gültigen Zeitzone-Strings in Ihrer Nähe zu erhalten.

0

Eine schnelle Ergänzung zur oben genannten DATE_FORMAT-Lösung. Ihr Format kann eine Zeichenkette sein, in diesem Fall funktioniert es wie oben notiert durch den Aufruf von strftime, aber Sie können das Format auch als ein Lambda definieren: