测试设置
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
为什么?发生了什么事?
答案 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]