2012-05-10 2 views
9

In Rails sehe ich, dass ich ein paar Optionen habe, um ein Datum und ein Datum zu analysieren. Was ist die beste Vorgehensweise, um Daten nur zu analysieren, um sie über ActiveRecord in der Datenbank zu speichern? Und warum?Womit soll ich das Datum immer mal analysieren? DateTime, Zeit, Zeit.Zone?

Time.zone.parse(...) 
Time.parse(...) 
DateTime.parse(...) 
+0

Auch [diese] (http://stackoverflow.com/questions/9138515/when -should-i-use-datetime-vs-date-time-fields-in-ruby-rails) und [dies] (http://stackoverflow.com/questions/1261329/whats-the-difference-with-datetime-) und-time-in-ruby/1261435 # 1261435), die DateTime verwenden soll, wenn es sich um Daten oder Daten handelt, die weit in der Zukunft liegen. –

Antwort

13

mit Time.zone.parse gehen, wenn Sie nur in Active schreiben möchten.

DateTime sollte vermieden werden. Wenn Sie mit Datumsangaben arbeiten, sollten Sie stattdessen Date.parse verwenden.

Darüber hinaus hängt es davon ab, ob die Eingabe mit Zeitzoneninformationen geliefert wird, worauf die aktuelle Zeitzone eingestellt ist und ob Sie Zeitzonen in Ihren Daten haben möchten.

Time.zone.parse gibt eine ActiveSupport :: TimeWithZone zurück, standardmäßig UTC.

> Time.zone.parse("12:30") 
=> Thu, 10 May 2012 12:30:00 UTC +00:00 

Time.parse gibt eine Zeit zurück, mit einer Zone, wenn sie in der Eingabe angegeben ist, oder der lokalen TZ.

> Time.parse("12:30") 
=> 2012-05-09 12:30:00 -0700 

Für eine detailliertere Erklärung von Ruby Zeitvergleiche und Präzision, lesen Sie diesen Blog-Post:

http://blog.tddium.com/2011/08/07/rails-time-comparisons-devil-details-etc/

+1

Time.zone.parse "Standard" auf UTC, wenn Ihre Rails-App standardmäßig auf UTC (in environment.rb) eingestellt ist ... Time.parse verwendet standardmäßig den lokalen Zeitzonen-Offset des Servers, unabhängig von der Rails-App. – Pavling

+0

Hey, 'Time.zone.parse' nimmt die Rails-Standardzone korrekt, während DateTime UTC zurückgibt. also +1, aber gibt es einen anderen Grund für "DateTime sollte vermieden werden."? –

1

Zeiten, die durch Active automatisch eingestellt werden (z.B. created_at und updated_at) wieder als ActiveSupport::TimeWithZone Instanzen.

Nach der Dokumentation, ActiveSupport::TimeWithZone und Time haben die gleiche API, also Time ist was ich verwenden würde.

Auf einem nicht verwandten Notiz gibt es Methoden to_time und to_datetime, die Sie auf Strings anrufen:

"2012-05-09".to_time # => 2012-05-09 00:00:00 UTC 
"2012-05-09".to_datetime # => Wed, 09 May 2012 00:00:00 +0000 
Verwandte Themen