Skip to content

Instantly share code, notes, and snippets.

@weidenfreak
Created October 31, 2012 14:21
Show Gist options
  • Save weidenfreak/3987288 to your computer and use it in GitHub Desktop.
Save weidenfreak/3987288 to your computer and use it in GitHub Desktop.
Timecop and milliseconds
#
# freezing DateTime.now
#
# in Rails
$ rails c
Loading development environment (Rails 3.2.8)
# DateTime and Time have milliseconds before freezing time
>> DateTime.now.iso8601 9
=> "2012-10-29T16:28:46.534621000+01:00"
>> Time.now.nsec
=> 207961000
# After freezing time, DateTime and Time both loose milliseconds
>> Timecop.freeze DateTime.now
=> 2012-10-29 16:29:12 +0100
>> DateTime.now.iso8601 9
=> "2012-10-29T16:29:12.000000000+01:00"
>> Time.now.nsec
=> 0
# in plain Ruby
$ irb
>> require 'date'
=> true
>> require 'timecop'
=> true
# DateTime and Time have milliseconds before freezing time
>> DateTime.now
=> #<DateTime: 2012-10-29T16:28:18+01:00 ((2456230j,55698s,544205000n),+3600s,2299161j)>
>> Time.now.nsec
=> 211554000
# After freezing time, only Time looses milliseconds
>> Timecop.freeze DateTime.now
=> 2012-10-29 16:29:25 +0100
>> DateTime.now
=> #<DateTime: 2012-10-29T16:29:25+01:00 ((2456230j,55765s,0n),+3600s,2299161j)>
>> Time.now.nsec
=> 0
#
# freezing Time.now
#
# in Rails
$ rails c
Loading development environment (Rails 3.2.8)
# After freezing time, only DateTime looses milliseconds
>> Timecop.freeze Time.now
=> 2012-10-29 16:39:27 +0100
>> Time.now.nsec
=> 459204000
>> DateTime.now.iso8601 9
=> "2012-10-29T16:39:27.000000000+01:00"
# in plain Ruby
$ irb
>> require 'date'
=> true
>> require 'timecop'
=> true
# After freezing time, neither Time nor DateTime looses milliseconds
>> Timecop.freeze Time.now
=> 2012-10-29 16:39:10 +0100
>> Time.now.nsec
=> 325934171
>> DateTime.now.iso8601 9
=> "2012-10-29T16:40:38.188632000+01:00"
#
# that leads to some confusion...
# if you freeze Time
#
$ rails c
Loading development environment (Rails 3.2.8)
>> Timecop.freeze Time.now
=> 2012-10-29 18:37:03 +0100
>> time = Time.now
=> 2012-10-29 18:37:03 +0100
>> datetime = DateTime.now
=> Mon, 29 Oct 2012 18:37:03 +0100
>> time == datetime
=> false
>> Timecop.return
=> 2012-10-29 18:37:57 +0100
>> Timecop.freeze DateTime.now
=> 2012-10-29 18:38:19 +0100
>> time = Time.now
=> 2012-10-29 18:38:19 +0100
>> datetime = DateTime.now
=> Mon, 29 Oct 2012 18:38:19 +0100
>> time == datetime
=> true
>> time.eql? datetime
=> false
>> time.class
=> Time
>> datetime.class
=> DateTime
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment