2012-05-10 6 views
9

In Rails, vedo che ho alcune opzioni per analizzare una data e una data-ora. Qual è la migliore pratica per le date di analisi al solo fine di mantenerle nel DB tramite ActiveRecord? E perché?Con quale intervallo di tempo devo sempre analizzare? DateTime, Time, Time.zone?

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

anche [questa] (http://stackoverflow.com/questions/9138515/when -should-i-use-datetime-vs-date-time-fields-in-ruby-rails) e [this] (http://stackoverflow.com/questions/1261329/whats-the-difference-between-datetime- e-time-in-ruby/1261435 # 1261435), che dice di usare DateTime quando si tratta di date o date lontane nel futuro. –

risposta

13

andare con Time.zone.parse se si vuole solo scrivere in ActiveRecord.

DateTime deve essere evitato. Se gestisci le date, dovresti utilizzare invece Date.parse.

Oltre a ciò, dipende dal fatto che l'input sia fornito con informazioni sul fuso orario, su quale sia il fuso orario corrente e se si desidera utilizzare i fusi orari nei dati.

Time.zone.parse restituirà un ActiveSupport :: TimeWithZone, per impostazione predefinita su UTC.

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

Time.parse restituirà un orario, con una zona se è specificato nell'input o la TZ locale.

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

Per una spiegazione più dettagliata dei confronti temporali di Ruby e di precisione, leggere questo post del blog:

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

+1

Time.zone.parse "default" su UTC se l'app Rails è impostata come predefinita su UTC (in environment.rb) ... Time.parse fa riferimento al fuso orario locale del server indipendentemente dall'app Rails. – Pavling

+0

Ehi, 'Time.zone.parse' prende correttamente la zona predefinita delle rotaie, mentre DateTime restituisce UTC. quindi +1, ma c'è qualche altra ragione per "DateTime dovrebbe essere evitato."? –

1

Times che sono configurate automaticamente dalla ActiveRecord (ad esempio created_at e updated_at) tornare come ActiveSupport::TimeWithZone istanze.

Secondo la documentazione, ActiveSupport::TimeWithZone e Time hanno la stessa API, quindi Time è quello che vorrei utilizzare.

Su una nota indipendenti, ci sono metodi to_time e to_datetime che è possibile chiamare sulle stringhe:

"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 
Problemi correlati