Skip to content

Commit

Permalink
[fix] sub-millisecond datetime difference handling (#5516)
Browse files Browse the repository at this point in the history
fixes #5493
  • Loading branch information
ikaronen-relex authored and kares committed Dec 13, 2018
1 parent f8899fc commit 9eedcdd
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 2 deletions.
1 change: 1 addition & 0 deletions core/src/main/java/org/jruby/ext/date/RubyDate.java
Original file line number Diff line number Diff line change
Expand Up @@ -1213,6 +1213,7 @@ private RubyNumeric op_minus_date(ThreadContext context, final RubyDate that) {

RubyNumeric subDiff = subMillisDiff(context, that);
if ( ! subDiff.isZero() ) { // diff += diff_sub;
subDiff = subDiff.convertToRational().op_div(context, RubyFixnum.newFixnum(context.runtime, DAY_MS)); // #5493
return (RubyNumeric) diffMillis.op_plus(context, subDiff);
}
return diffMillis;
Expand Down
2 changes: 1 addition & 1 deletion spec/ruby/library/datetime/add_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@
describe "DateTime#+" do
it "is able to add sub-millisecond precision values" do
datetime = DateTime.new(2017)
(datetime + 0.00001).to_time.usec.should == 864000
(datetime + 0.00001001).to_time.usec.should == 864864
end
end
12 changes: 11 additions & 1 deletion spec/ruby/library/datetime/subtract_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,16 @@
describe "DateTime#-" do
it "is able to subtract sub-millisecond precision values" do
date = DateTime.new(2017)
((date + 0.00001) - date).should == Rational(1, 100000)
diff = Rational(123456789, 24*60*60*1000*1000)
((date + diff) - date).should == diff
(date - (date + diff)).should == -diff
(date - (date - diff)).should == diff
((date - diff) - date).should == -diff
end

it "correctly calculates sub-millisecond time differences" do #5493
dt1 = DateTime.new(2018, 1, 1, 0, 0, 30)
dt2 = DateTime.new(2018, 1, 1, 0, 1, 29.000001)
((dt2 - dt1) * 24 * 60 * 60).should == 59.000001
end
end

0 comments on commit 9eedcdd

Please sign in to comment.