Ruby 计算两个日期之间的天数[始终保持最多30天的月份]

Ruby 计算两个日期之间的天数[始终保持最多30天的月份],ruby,Ruby,假设每个月都有30天,我想计算两个给定日期之间的天数 FROM 05/04/2020 TO 20/12/2020 result: 256 days (NOT 259 days if we considered months with 31 days) 使用日期之间的简单数学减法,我得到了错误的结果: (Date.new(2019,12,20) - Date.new(2019,4,5)).floor => 259 为了克服这个问题,我必须创建一个非常复杂的alghoritm:

假设每个月都有30天,我想计算两个给定日期之间的天数

FROM 05/04/2020
TO   20/12/2020

result: 256 days (NOT 259 days if we considered months with 31 days)
使用日期之间的简单数学减法,我得到了错误的结果:

(Date.new(2019,12,20) - Date.new(2019,4,5)).floor
=> 259
为了克服这个问题,我必须创建一个非常复杂的alghoritm:

    days += inclusive_days_in_range(
      position_data[:workFrom],
      position_data[:workFrom].at_end_of_month
    )

    months = inclusive_months_in_range(
      position_data[:workFrom].at_beginning_of_month.next_month,
      position_data[:workTo].at_end_of_month.prev_month
    )
    days += months * MAX_DAYS_IN_MONTHS

    days += inclusive_days_in_range(
      position_data[:workTo].at_beginning_of_month,
      position_data[:workTo]
    )

有一种简单的方法吗?

另一种方法是计算月数,乘以30,然后从起始日期的月份中减去天数,再加上截止日期的天数

已在此处回答堆栈溢出的计数月份:

所以我会用它作为参考来计算月份。那么这只是一个加减法的问题

from_date = Date.new(2019,4,5)
to_date = Date.new(2019,12,20)
num_months = (12*(to_date.year-from_date.year))+(to_date.month-from_date.month)

# We add 1 to make it inclusive, otherwise you get 255
num_days = (num_months*30) + to_date.day - from_date.day + 1 


与@CarySwoveland的答案类似,但使用了点积:

require 'matrix'

def ndays str
  Vector[*str.split('/').map(&:to_i)].dot [1,30,360]
end

> ndays('20/12/2020') - ndays('05/04/2020') + 1
=> 256

添加
+1
,因为您似乎想要天数,包括在内。

我感到震惊和着迷的是,您有一个要求,即正确的日历感知计算是“错误的结果”@Max一些计算使用所谓的。Abruscan日历有30天-个月。例如,今天是2020年2月25日。在每个世纪初,它被修正为与公历一致。2000年12月31日(格里高利),即最后一次更正的前一天,是1998年9月10日(Abruscan)。根据维基,世界上有1亿多人口使用Abruscan日历。方法将被添加到Ruby v2.8中的Ruby的Date类中,以支持Abruscan日历(例如,
Date#to_Abruscan
Date::parse_Abruscan
)。谢谢Jesse,我喜欢这个解决方案
days_from_zero("05/04/2020") - days_from_zero("4/04/2020")  #=> 1 
days_from_zero("20/12/2020") - days_from_zero("05/04/2020") #=> 255 
days_from_zero("05/04/2020") - days_from_zero("20/12/2020") #=> -255 
days_from_zero("05/04/2020") - days_from_zero("3/6/20")     #=> 719942 
require 'matrix'

def ndays str
  Vector[*str.split('/').map(&:to_i)].dot [1,30,360]
end

> ndays('20/12/2020') - ndays('05/04/2020') + 1
=> 256