计算差异月使用Groovy两个日期之间(Calculate difference in months

2019-07-29 15:55发布

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

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的方式做到这一点,而无需使用其他图书馆?

Answer 1:

monthBetween = (start[Calendar.MONTH] - end[Calendar.MONTH]) + 1
yearsBetween = start[Calendar.YEAR] - end[Calendar.YEAR]
months = monthBetween + (yearsBetween * 12)


Answer 2:

(start[Calendar.MONTH]-end[Calendar.MONTH]+1)+((start[Calendar.YEAR]-end[Calendar.YEAR])*12)


Answer 3:

只是为了好玩(因为它可能不太可读,并使用更多的资源),你也可以这样做:

months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
                     .unique()
                     .size() 


Answer 4:

我同意@JonSkeet:你应该继续使用乔达时间。 IMO,乔达,时间和Groovy是彼此非常适合。

你可以来(我能找到),最接近的是使用的额外日期的方法Groovy的JDK做到这一点:

int differenceInDays = start - end

其计算两个日期之间的差异。 这使你的日子自己转换成个月,这吮吸。

与乔达时间坚持。



Answer 5:

如果你想在每月的名字几个月的差异,而不是几天和几周内,你可以做到这一点。

例如: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



Answer 6:

作为乔恩斯基特提到的,你使用乔达时间,然后包裹你的头围绕这个话题的更好。

要知道,虽然乔达时间返回两个日期,包括日光节约时间妥善处理之间的全月数



文章来源: Calculate difference in months between two dates with Groovy