2

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

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 的方式实现这一点?

4

6 回答 6

7
monthBetween = (start[Calendar.MONTH] - end[Calendar.MONTH]) + 1
yearsBetween = start[Calendar.YEAR] - end[Calendar.YEAR]
months = monthBetween + (yearsBetween * 12)
于 2012-05-30T16:30:22.990 回答
2

如果您想按月份名称而不是几天和几周来获得月份的差异,您可以这样做。

例如:2013 年 12 月 7 日与 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

于 2015-06-25T15:11:47.930 回答
1
(start[Calendar.MONTH]-end[Calendar.MONTH]+1)+((start[Calendar.YEAR]-end[Calendar.YEAR])*12)
于 2012-05-30T16:46:23.543 回答
1

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

months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
                     .unique()
                     .size() 
于 2012-05-31T07:53:53.240 回答
1

我同意@JonSkeet:你应该继续使用 Joda-Time。IMO、Joda-Time 和 Groovy 非常适合彼此。

您能找到的最接近的(我能找到的)是使用Groovy JDK中的其他 Date 方法来执行此操作:

int differenceInDays = start - end

它以天为单位计算两个日期之间的差异。这让您自己将日子转换为月份,这很糟糕。

坚持使用 Joda-Time。

于 2012-05-31T16:16:31.103 回答
0

正如 Jon Skeet 所提到的,您最好使用 Joda-Time,然后围绕这个主题展开思考。

请注意,Joda-Time 返回两个日期之间的整月数,包括正确处理夏令时。

于 2013-12-23T09:28:59.797 回答