Ruby 计算两个日期之间的天数[始终保持最多30天的月份]
假设每个月都有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:
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