使用Groovy计算两个日期之间的月差异

时间:2012-05-30 16:04:42

标签: date time groovy datediff

我需要计算两个日期之间的月份差异。

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方式实现此目的?

6 个答案:

答案 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会在两个日期之间返回完整月数,包括正确处理夏令时。