如果每个月有 30 天,计算年、月、日的差异
Calculate difference in years, months, days if every month has 30 days
无法计算两个日期之间的年、月、日差。问题是每个月有30天,每年有365天,无一例外。这里有很多主题,但我还没有找到任何可以解决我的问题或帮助解决问题的主题。我找到的每一个题目都只是用正常的方式解决计算差异的问题,这很简单。
我如何计算这种差异?
我正在使用 Java 7(没有机会安装 joda time)和 groovy 2.4.0.
例如:
date from date to y m d
2014-02-01 - 2015-02-01 => 1 0 1
2000-02-10 - 2003-01-18 => 2 11 9
2004-02-02 - 2004-06-24 => 0 4 23
谢谢。
您的示例似乎不一致。在第一种情况下,结束日期是排他性的,在其他两种情况下,它是包容性的。例如2015-01-01 到 2015-01-01 应该给 0d 还是 1d?
假设排他性,看来你需要做的是这样的:
给定 fromDate 为 yearFrom、monthFrom 和 daysFrom,toDate 为 yearTo、monthTo 和 daysTo:
days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo
假设一年 365 天,一个月 30 天,将为您提供天数差异。
那么,差异将是:
yearDifference = days/365 (as integer)
monthDifference = (days%365)/30
daysDifference = (days%365)%30
评论后编辑:
如果你需要它是包容性的,按照最后两个例子,只需在 "days":
中添加一个
days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo+1
在 Groovy 中想到了这个,不确定它是否符合您的要求,但它给出了问题中的结果:
def dateMalarkey(Date from, Date to) {
def val = [from, to].collect { d ->
def cal = Calendar.instance
cal.time = d
[y: cal[Calendar.YEAR], m: cal[Calendar.MONTH], d: cal[Calendar.DAY_OF_MONTH]]
}.inject { p, n ->
[y: Math.abs(p.y - n.y), m: Math.abs(p.m - n.m), d: Math.abs(p.d - n.d) + 1]
}
val.days = val.y * 365 + val.m * 30 + val.d
val
}
def inputs = [
[from: '2014-02-01', to: '2015-02-01'],
[from: '2000-02-10', to: '2003-01-18'],
[from: '2004-02-02', to: '2004-06-24']
]
inputs.each { d ->
println "$d.from - $d.to => " +
dateMalarkey(Date.parse('yyyy-MM-dd', d.from), Date.parse('yyyy-MM-dd', d.to))
}
无法计算两个日期之间的年、月、日差。问题是每个月有30天,每年有365天,无一例外。这里有很多主题,但我还没有找到任何可以解决我的问题或帮助解决问题的主题。我找到的每一个题目都只是用正常的方式解决计算差异的问题,这很简单。 我如何计算这种差异?
我正在使用 Java 7(没有机会安装 joda time)和 groovy 2.4.0.
例如:
date from date to y m d
2014-02-01 - 2015-02-01 => 1 0 1
2000-02-10 - 2003-01-18 => 2 11 9
2004-02-02 - 2004-06-24 => 0 4 23
谢谢。
您的示例似乎不一致。在第一种情况下,结束日期是排他性的,在其他两种情况下,它是包容性的。例如2015-01-01 到 2015-01-01 应该给 0d 还是 1d? 假设排他性,看来你需要做的是这样的: 给定 fromDate 为 yearFrom、monthFrom 和 daysFrom,toDate 为 yearTo、monthTo 和 daysTo:
days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo
假设一年 365 天,一个月 30 天,将为您提供天数差异。 那么,差异将是:
yearDifference = days/365 (as integer)
monthDifference = (days%365)/30
daysDifference = (days%365)%30
评论后编辑: 如果你需要它是包容性的,按照最后两个例子,只需在 "days":
中添加一个days = -yearFrom*365-monthFrom*30-daysFrom+yearTo*365+monthTo*30+daysTo+1
在 Groovy 中想到了这个,不确定它是否符合您的要求,但它给出了问题中的结果:
def dateMalarkey(Date from, Date to) {
def val = [from, to].collect { d ->
def cal = Calendar.instance
cal.time = d
[y: cal[Calendar.YEAR], m: cal[Calendar.MONTH], d: cal[Calendar.DAY_OF_MONTH]]
}.inject { p, n ->
[y: Math.abs(p.y - n.y), m: Math.abs(p.m - n.m), d: Math.abs(p.d - n.d) + 1]
}
val.days = val.y * 365 + val.m * 30 + val.d
val
}
def inputs = [
[from: '2014-02-01', to: '2015-02-01'],
[from: '2000-02-10', to: '2003-01-18'],
[from: '2004-02-02', to: '2004-06-24']
]
inputs.each { d ->
println "$d.from - $d.to => " +
dateMalarkey(Date.parse('yyyy-MM-dd', d.from), Date.parse('yyyy-MM-dd', d.to))
}