我需要计算两个日期之间的月份差异。
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)
使用Joda-Time使用这样的方法很容易实现:
months = Months.monthsBetween(start, end).getMonths()
如何在不使用其他库的情况下以Groovy方式实现此目的?
答案 0 :(得分:7)
monthBetween = (start[Calendar.MONTH] - end[Calendar.MONTH]) + 1
yearsBetween = start[Calendar.YEAR] - end[Calendar.YEAR]
months = monthBetween + (yearsBetween * 12)
答案 1 :(得分:1)
(start[Calendar.MONTH]-end[Calendar.MONTH]+1)+((start[Calendar.YEAR]-end[Calendar.YEAR])*12)
答案 2 :(得分:1)
只是为了好玩(因为它可能不太可读,并且使用更多资源),你也可以这样做:
months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
.unique()
.size()
答案 3 :(得分:1)
我同意@JonSkeet:你应该继续使用Joda-Time。 IMO,Joda-Time和Groovy非常适合彼此。
你能找到的最接近的(我能找到的)就是使用Groovy JDK中的其他日期方法来做到这一点:
int differenceInDays = start - end
计算两个日期之间的差异,以天为单位。这让你自己把日子转换成几个月,这很糟糕。
坚持Joda-Time。
答案 4 :(得分:1)
如果您希望逐个月的名称,而不是几天和几周,您可以这样做。
Ex:2013年12月7日vs 2014年1月21日将给你一个差异
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
答案 5 :(得分:0)
正如Jon Skeet所说,你最好使用Joda-Time,然后围绕这个主题。
请注意,Joda-Time会在两个日期之间返回完整月数,包括正确处理夏令时。