2011-08-20 13 views
6

tengo algo de tiempo definidos a partir de mi base de datos, y esto es lo que parece:la comparación de hora o fecha zanjas en Ruby on Rails

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

y que está bien, que me asignó 01/01/2000 también , tengo algo que sucedió en alguna fecha y hora

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

así que estaba esperando, que .to_time sería deshacerse de mi cita, pero eso no suceda

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

por lo tanto, ahora, comparar si algo pasó antes de las 8:00 es inútil. Entonces, ¿cómo puedo comparar eso? ¿Hay alguna manera de establecer dog.pocetak en 2000-01-01 sin touch clock?

gracias

p.s. Además, pensé en crear una nueva variable de tiempo, solo para obtener las horas y los minutos variables anteriores, pero ¿estos métodos no funcionan?

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

pero

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>' 

muy frustrante :)

Respuesta

3

Con ActiveSupport y Time.change puede restablecer el año, mes y día si te gusta:

> 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 

De esta manera usted podría comparar los "tiempos" entre unos y otros, si todos ellos se restablecen a la misma fecha. Sin embargo, no estoy seguro si esta es una buena solución, depende de lo que realmente está buscando.

EDITAR:

De acuerdo con la sugerencia de mu que también podría echar un vistazo a los tipos de datos time.

+0

Gracias por su respuesta :) – user899119

+0

Tanto [PostgreSQL] (http://www.postgresql.org/docs/9.0/interactive/datatype-datetime. html) y [MySQL] (http://dev.mysql.com/doc/refman/5.6/en/time.html) tienen tipos de datos 'time', PostgreSQL también tiene un tipo de intervalo (el' tiempo 'de MySQL hace doble tarea para la hora del día y los intervalos).Esperaría que otras bases de datos tengan tipos similares (todos sutilmente incompatibles, estándares y todo eso :). –

+0

@mu - Gracias por la aclaración mu. ¿Cómo extrañé eso ...? Necesito dormir más. Editado – Casper

3

Para obtener los minutos de un objeto de tiempo, usted quiere min no minutes. No se puede tener un instante de tiempo que sólo una "hora del día" (es decir, sin año, mes, ...) pero se puede utilizar strftime para obtener una versión de cadena que comparar adecuadamente:

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 

O se podría comparar los individuales hour, min y sec componentes:

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

qué se acerque a tomar depende, como es habitual, de su situación específica y de lo que esté sucediendo en en esa vecindad.

+0

Gracias ... que ayudó a :) – user899119

+0

strftime es maravilloso – jschorr