2012-05-10 9 views
9

W Railsach widzę, że mam kilka opcji do przeanalizowania daty i daty i czasu. Jaka jest najlepsza praktyka w przypadku analizowania dat wyłącznie w celu utrwalenia ich w bazie danych za pośrednictwem ActiveRecord? I dlaczego?Z czym zawsze powinienem analizować datę? DateTime, Time, Time.zone?

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

też [to] (http://stackoverflow.com/questions/9138515/when -should-i-use-datetime-vs-date-time-fields-in-ruby-rails) i [this] (http://stackoverflow.com/questions/1261329/whats-the-difference-between-datetime- and-time-in-ruby/1261435 # 1261435), który mówi o używaniu DateTime podczas zajmowania się datami lub datami odległymi w przyszłości. –

Odpowiedz

13

Idź z Time.zone.parse jeśli chcesz po prostu napisać do ActiveRecord.

Należy unikać używania DateTime. Jeśli obsługujesz daty, powinieneś użyć Date.parse.

Poza tym, zależy to od tego, czy dane wejściowe zawierają informacje o strefie czasowej, o tym, jaka jest aktualna strefa czasowa i czy chcesz stref czasowych w danych.

Time.zone.parse zwróci ActiveSupport :: TimeWithZone, domyślnie UTC.

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

Time.parse zwróci Czas, ze strefą, jeśli jest określona na wejściu lub lokalną strefą TZ.

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

celu bardziej szczegółowego wyjaśnienia Ruby porównań czasu i precyzji, przeczytaj ten post na blogu:

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

+1

Time.zone.parse "domyślnie" na UTC, jeśli twoja aplikacja Railsowa ma domyślną wartość UTC (w environment.rb) ... Time.parse domyślnie określa lokalną strefę czasową serwera niezależnie od aplikacji Rails. – Pavling

+0

Hej, 'Time.zone.parse' poprawnie przyjmuje strefę domyślną szyn, a DateTime zwraca UTC. więc +1, ale czy istnieje jakikolwiek inny powód, dla którego należy unikać "DateTime"? –

1

razy, które są automatycznie ustawiane przez ActiveRecord (np created_at i updated_at) powrócić jako ActiveSupport::TimeWithZone przypadkach.

Zgodnie z dokumentacją, ActiveSupport::TimeWithZone i Time mają takie samo API, więc Time jest tym, czego bym użył.

Na niepowiązanych uwaga, istnieją metody to_time i to_datetime że można zadzwonić na smyczki:

"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 
Powiązane problemy