Ruby与Date.to_time操作之间的Ruby时间计算不一致

时间:2016-11-01 10:15:55

标签: ruby datetime

测试设置

irb(main):001:0> require 'date'
=> true
irb(main):007:0> require 'active_support/all'
=> true
irb(main):002:0> start = Date.new(2016,10,1)
=> #<Date: 2016-10-01 ((2457663j,0s,0n),+0s,2299161j)>
irb(main):003:0> finish = Date.new(2016,11,1)
=> #<Date: 2016-11-01 ((2457694j,0s,0n),+0s,2299161j)>

我希望finish-start.div都返回1(或0),但大多数都是一致的。然而奇怪的是,当我使用Date对象时,它返回0,但是当我使用相同的Date对象并将其转换为to_time时,它返回1.

irb(main):008:0> (finish-start).div(1.month)
=> 0
irb(main):009:0> start + 1.month <= finish
=> true

irb(main):010:0> (finish.to_time - start.to_time).div(1.month)
=> 1
irb(main):011:0> start.to_time + 1.month <= finish.to_time
=> true

为什么?发生了什么事?

2 个答案:

答案 0 :(得分:1)

finish - start调用Date#-并返回天数,即31:

finish - start
#=> (31/1)
另一方面,

finish.to_time - start.to_time调用Time#-并返回秒数,即60×60×24×31:

finish.to_time - start.to_time
#=> 2682000.0

1.month返回ActiveSupport::Duration个实例,相当于30天内的秒数,即60×60×24×30:

1.month.to_i
#=> 2592000

1.month == 2592000
#=> true

考虑到上述情况,您的计算相当于:

     31 / 2592000 #=> 0
2682000 / 2592000 #=> 1

答案 1 :(得分:0)

计算时

finish-start
#=> (61/1) #(days/hours+1)

finish.to_time - s.to_time
#=> 2592000 #seconds

查看div的结果,您可以使用divmod

(finish-start).divmod(1.month)
=> [0, (31/1)]
(finish.to_time - start.to_time).divmod(1.month)
=> [1, 90000.0]

使其工作原理相同,您可以使用下一个:

(finish-start).days.to_i.divmod(1.month.to_i)
#=> [1, 86400]