# Opening the Time Class

**URL:** <https://www.ruby-forum.com/t/opening-the-time-class/136752>\
**Category:** Rails\
**Created:** [May 6, 2008, 4:20am UTC](https://www.ruby-forum.com/t/opening-the-time-class/136752 "2008-05-06T04:20:58Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![jules](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/41988e/32.png) [@jules](https://www.ruby-forum.com/u/jules)\
**Post date:** [May 6, 2008, 4:20am UTC](https://www.ruby-forum.com/t/opening-the-time-class/136752/1 "2008-05-06T04:20:58Z")

</div>

I’m trying to add some extra methods to the time class by opening it  
up like this:

class Time # opening up ruby time

ONE\_DAY\_IN\_SECS = 86400

def self.yesterday\_at\_midnight(today = Time.now)  
time\_yesterday = today.to\_i - ONE\_DAY\_IN\_SECS  
yesterday = Time.at( time\_yesterday )  
return "#{yesterday.year}-#{yesterday.month\_with\_leading\_zero}-  
#{yesterday.day\_with\_leading\_zero} "  
end

# … etc

end

When I run my test from within NetBeans 6.0.1…

require ‘test/unit’

class TimeTest \< Test::Unit::TestCase

MONDAY\_05\_05\_2008 = 1209972973

def test\_can\_open\_time\_to\_add\_yesterday\_at\_midnight  
today = Time.yesterday\_at\_midnight(Time.at(MONDAY\_05\_05\_2008))  
expected = “2008-05-04”  
assert( expected == today)  
end

end

This works and I get a passing test.

However if I include an additional require line in my test: require  
‘unit\_test\_helper’ then I get the following error:

C:/ruby/lib/ruby/site\_ruby/1.8/rubygems/source\_index.rb:92:in  
`load_specification': undefined method`parse’ for Time:Class  
(NoMethodError)  
from C:/ruby/lib/ruby/site\_ruby/1.8/rubygems/specification.rb:  
314:in `date=' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/specification.rb: 416:in`send’  
from C:/ruby/lib/ruby/site\_ruby/1.8/rubygems/specification.rb:  
416:in `initialize' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/specification.rb: 412:in`each’  
from C:/ruby/lib/ruby/site\_ruby/1.8/rubygems/specification.rb:  
412:in `initialize' from (eval):1:in`new’  
from (eval):1:in `load_specification' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems/source_index.rb: 128:in`eval’  
… 11 levels…  
from C:/ruby/lib/ruby/site\_ruby/1.8/rubygems.rb:211:in  
`synchronize' from C:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:211:in`searcher’  
from C:/ruby/lib/ruby/site\_ruby/1.8/rubygems/custom\_require.rb:  
30:in `require’  
from C:/dev/esp/test/unit/models/time\_test.rb:2

I think this has something to do with not requiring time properly, but  
I can’t work it out. Has anyone has a similar problem?

Jules

---

<div class="post-metadata">

**Author:** ![jules](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/41988e/32.png) [@jules](https://www.ruby-forum.com/u/jules)\
**Post date:** [May 7, 2008, 6:14am UTC](https://www.ruby-forum.com/t/opening-the-time-class/136752/2 "2008-05-07T06:14:56Z")

</div>

I managed to solve my problem using the Chronic library.

[http://chronic.rubyforge.org/](http://chronic.rubyforge.org/)

irb(main):002:0\> require ‘chronic’  
=\> true  
irb(main):003:0\> Chronic.parse(‘yesterday’)  
=\> Tue May 06 12:00:00 +1000 2008  
irb(main):004:0\>

---

<div class="post-metadata">

**Author:** ![jules](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/41988e/32.png) [@jules](https://www.ruby-forum.com/u/jules)\
**Post date:** [May 7, 2008, 7:11am UTC](https://www.ruby-forum.com/t/opening-the-time-class/136752/3 "2008-05-07T07:11:09Z")

</div>

Um…

Time.now.yesterday = This time yesterday

Therefore,

Time.now.yesterday.beginning\_of\_day = Midnight, yesterday.

---

<div class="post-metadata">

**Author:** ![jules](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/j/41988e/32.png) [@jules](https://www.ruby-forum.com/u/jules)\
**Post date:** [May 8, 2008, 9:42am UTC](https://www.ruby-forum.com/t/opening-the-time-class/136752/4 "2008-05-08T09:42:39Z")

</div>

yep, your logic is sound.

On sqlite3, doing a select with the date ‘2008-05-07’ defaults to  
midnight.
