2

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

楽しみのために(おそらく読みにくく、より多くのリソースを使用するため)、次のこともできます。

months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
                     .unique()
                     .size() 
于 2012-05-31T07:53:53.240 に答える
1
(start[Calendar.MONTH]-end[Calendar.MONTH]+1)+((start[Calendar.YEAR]-end[Calendar.YEAR])*12)
于 2012-05-30T16:46:23.543 に答える
1

@JonSkeet に同意します。Joda-Time を引き続き使用する必要があります。IMO、Joda-Time、および Groovy は、互いに最適です。

あなたが来ることができる(私が見つけることができる)最も近いのは、Groovy JDKで追加の Date メソッドを使用してこれを行うことです:

int differenceInDays = start - end

これは、2 つの日付の差を日数で計算します。これでは、自分で日を月に変換する必要があります。

Joda-Timeに固執します。

于 2012-05-31T16:16:31.103 に答える