2011-08-20 4 views
6

ho un po 'di tempo definiti dal mio database, e questo è come appare:tempo a confrontare o la data ammaraggio in Ruby on Rails

ruby-1.9.2-p290 :017 > djel.smjena.pocetak1.to_time 
=> 2000-01-01 08:00:00 +0100 

e che è ok, mi ha assegnato 2000/01/01 anche , ho qualcosa che è accaduto in qualche datetime

ruby-1.9.2-p290 :019 > dog.pocetak 
=> Thu, 25 Aug 2011 08:18:00 UTC +00:00 

Quindi speravo, che .to_time sarebbe abbandonare la mia data, ma questo non accada

ruby-1.9.2-p290 :020 > dog.pocetak.to_time 
=> Thu, 25 Aug 2011 08:18:00 UTC +00:00 

quindi, ora, confrontando se qualcosa è successo prima delle 8:00 è inutile. Quindi, come posso confrontarlo? c'è un modo per impostare dog.pocetak su 2000-01-01 senza touch clock?

grazie

p.s. inoltre, ho pensato di creare una nuova variabile temporale, solo per passare da vecchie ore e minuti variabili, ma questi metodi non funzionano?

ruby-1.9.2-p290 :059 > dog.pocetak.hour 
=> 8 

ma

ruby-1.9.2-p290 :060 > dog.pocetak.minute 
NoMethodError: undefined method `minute' for 2011-08-25 08:18:00 UTC:Time 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.10/lib/active_support/time_with_zone.rb:322:in `method_missing' 
     from (irb):60 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start' 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start' 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 
ruby-1.9.2-p290 :061 > dog.pocetak.minutes 
NoMethodError: undefined method `minutes' for 2011-08-25 08:18:00 UTC:Time 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/activesupport-3.0.10/lib/active_support/time_with_zone.rb:322:in `method_missing' 
     from (irb):61 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start' 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start' 
     from /home/dorijan/.rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 

davvero frustrante :)

risposta

3

Con ActiveSupport e Time.change è possibile ripristinare l'anno, mese e giorno, se vi piace:

> t = Time.now 
=> Sun Aug 21 00:46:29 +0000 2011 
> t.change(:month => 1, :day => 1, :year => 2000) 
=> Sat Jan 01 00:46:29 +0000 2000 

In questo modo si potrebbe confrontare i "tempi" tra l'altro, se tutti sono stati ripristinati al stessa data Non sono sicuro che questa sia una buona soluzione, dipende da cosa stai davvero cercando.

EDIT:

Come da suggerimento di mu si potrebbe anche dare un'occhiata al tipo di dati time.

+0

Grazie per la risposta :) – user899119

+0

Entrambi [PostgreSQL] (http://www.postgresql.org/docs/9.0/interactive/datatype-datetime. html) e [MySQL] (http://dev.mysql.com/doc/refman/5.6/en/time.html) hanno i tipi di dati 'time', PostgreSQL ha anche un tipo di intervallo (il' time' di MySQL fa il doppio dovere per ora del giorno e intervalli).Mi aspetto che altri database abbiano tipi simili (tutti però sottilmente incompatibili, standard e tutto il resto :). –

+0

@mu - Grazie per il chiarimento mu. Come mi sono perso? ..h. Bisogno di dormire di più. Modificato. – Casper

3

Per ottenere i minuti da un oggetto Tempo, vuoi min non minutes. Non si può avere un'istanza di tempo che è solo un "ora del giorno" (cioè non l'anno, il mese, ...), ma è possibile utilizzare strftime per ottenere una versione stringa che metterà a confronto corretto:

tod = Time.now.strftime('%H:%M:%S') 
# "17:07:23" 

if(t1.strftime('%H:%M:%S') == t2.strftime('%H:%M:%S')) 
    # Same time of day (to one second resolution) 
end 

Or si potrebbe confrontare le singole hour, min, e sec componenti:

if(t1.hour == t2.hour && t1.min == t2.min && t1.sec == t2.sec) 
    # Same time of day (to one second resolution) 
end 

cui ci si avvicina prendono dipende, come al solito, sulla vostra situazione specifica e che altro sta andando in in quella zona.

+0

Grazie ... che ha aiutato :) – user899119

+0

strftime è meraviglioso – jschorr