无法计算两个日期之间的年、月、日差异。问题是每月有30天,每年有365天,无一例外。这里有很多主题,但我还没有找到任何可以解决我的问题或帮助解决它的主题。我发现的每个题目都只是用正常的方式解决计算差异的问题,很简单。 我如何计算这样的差异?
我正在使用Java 7(没有机会安装joda时间)和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 = -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))
}
十年后......在现代 Java 中使用
Period
类。
Period period =
Period.between(
LocalDate.parse( "2014-02-01" ),
LocalDate.parse( "2015-02-01" )
);