Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Comparing time or ditching date in ruby on rails

I have some time defined from my database, and this is how it looks:

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

and that is ok, it assigned me 2000-1-1 also, I got something that happened in some datetime

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

So I was hoping, that .to_time would ditch my date, but that does not happen

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

so, now, comparing if something happened before 8:00 is useless. So, how can I compare that? is there a way to set dog.pocetak to 2000-01-01 without touch clock?

thank you

p.s. also, I thought of creating new time variable, only to get from old variable hours and minutes, but this methods dont work?

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

but

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

really frustrating :)

like image 728
user899119 Avatar asked Aug 20 '11 23:08

user899119


2 Answers

With ActiveSupport and Time.change you can reset the year, month and day if you like:

> 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

This way you could compare the "times" between each other, if they all were reset to the same date. Not sure if this is a good solution though, depends on what you really are looking for.

EDIT:

As per mu's suggestion you could also take a look at the time data type.

like image 83
Casper Avatar answered Sep 22 '22 06:09

Casper


To get the minutes from a Time object, you want min not minutes. You can't have a Time instance that's just a "time of day" (i.e. no year, month, ...) but you can use strftime to get a string version that will compare properly:

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 you could compare the individual hour, min, and sec components:

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

Which approach you take depends, as usual, on your specific situation and what else is going in in that vicinity.

like image 42
mu is too short Avatar answered Sep 22 '22 06:09

mu is too short