method

now

v2_6_3 - Show latest stable - Class: Time
now()
public

Creates a new Time object for the current time. This is same as Time.new without arguments.

Time.now            #=> 2009-06-24 12:39:54 +0900

3Notes

Freezing Time.now with Time.is

hosiawak · Aug 17, 20091 thank

Sometimes when writing unit tests/specifications our code sets an attribute of an object using Time.now because running specs/test takes time.

The solution is to "freeze" Time.now with the following Time.is method:

class Time

 def self.metaclass
   class << self; self; end
 end

# useful for unit testing
# Time.is(Time.now) do
#   Time.now # => Tue Nov 13 19:31:46 -0500 2007
#   sleep 2
#   Time.now # => Tue Nov 13 19:31:46 -0500 2007
# end
#
# Time.is("10/05/2006") do
#   Time.now # => Thu Oct 05 00:00:00 -0400 2006
#   sleep 2
#   Time.now # => Thu Oct 05 00:00:00 -0400 2006
# end
 def self.is(point_in_time)
   new_time = case point_in_time
              when String then Time.parse(point_in_time)
              when Time then point_in_time
              else raise ArgumentError.new("argument should be a string or time instance")
              end
   class << self
     alias old_now now
   end
   metaclass.class_eval do
     define_method :now do
       new_time
     end
   end
   yield
   class << self
     alias now old_now
     undef old_now
   end
 end

end

It's a good idea to add this to your spec_helper/test_helper and "freeze" time whenever you're testing functionality that depends on a specific time value.

Time.now in UTC

Tricon · Mar 24, 2010

A quick way to get the current time in UTC is:

Time.new.utc # => Wed Mar 24 14:38:19 UTC 2010

Freezing Time.now

alext · Feb 20, 2013

You'd be much better off using the Timecop gem ( https://rubygems.org/gems/timecop ) than than manually writing monkey-patches to freeze Time.now etc.

It also supports time travel (i.e. changing the time, but allowing the clock to continue running).