我需要计算月两个日期之间的差异。
start = new Date(112, 4, 30) // Wed May 30 00:00:00 CEST 2012
end = new Date(111, 9, 11) // Tue Oct 11 00:00:00 CEST 2011
assert 8 == monthsBetween(start, end)
使用乔达时它真的很容易像这样的东西来实现这一目标:
months = Months.monthsBetween(start, end).getMonths()
我怎样才能在一个Groovy的方式做到这一点,而无需使用其他图书馆?
monthBetween = (start[Calendar.MONTH] - end[Calendar.MONTH]) + 1
yearsBetween = start[Calendar.YEAR] - end[Calendar.YEAR]
months = monthBetween + (yearsBetween * 12)
(start[Calendar.MONTH]-end[Calendar.MONTH]+1)+((start[Calendar.YEAR]-end[Calendar.YEAR])*12)
只是为了好玩(因为它可能不太可读,并使用更多的资源),你也可以这样做:
months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
.unique()
.size()
我同意@JonSkeet:你应该继续使用乔达时间。 IMO,乔达,时间和Groovy是彼此非常适合。
你可以来(我能找到),最接近的是使用的额外日期的方法Groovy的JDK做到这一点:
int differenceInDays = start - end
其计算两个日期之间的差异。 这使你的日子自己转换成个月,这吮吸。
与乔达时间坚持。
如果你想在每月的名字几个月的差异,而不是几天和几周内,你可以做到这一点。
例如:2013年12月7日VS 2014年1月21日给你的1的差
Date dateFrom = Date.parse("yyyy-MM-dd", "2013-12-07")
Date dateTo = Date.parse("yyyy-MM-dd", "2014-01-21")
def diffMonths = { Date start, Date end ->
int diffYears = (start[Calendar.YEAR] - end[Calendar.YEAR]) * 12
int diffMonths = start[Calendar.MONTH] - end[Calendar.MONTH]
return diffYears + diffMonths
}
println diffMonths(dateTo, dateFrom)
下面将输出1
作为乔恩斯基特提到的,你使用乔达时间,然后包裹你的头围绕这个话题的更好。
要知道,虽然乔达时间返回的两个日期,包括日光节约时间妥善处理之间的全月数 。