2012-05-30 276 views
2

我需要計算兩個日期之間的月差。使用Groovy計算兩個日期之間的月差異

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的方式做到這一點,而無需使用其他圖書館?

+5

如果您已經使用Groovy(這是一個相當大的依賴)爲什麼你不*想要使用喬達時間? –

回答

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

不適用於我... 如果開始日期是2013年12月7日,並且結束日期是2014年1月21日,則輸出爲0.我認爲此解決方案假設開始日期總是晚於結束日期 –

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

只是爲了好玩(因爲它可能不太可讀,並使用更多的資源),你也可以這樣做:

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

對於有人會來這裏看到這種方法,並會認爲使用它:)不要這樣做。作爲一個例子,玩這些日期: 'Date dateFrom = Date.parse(「yyyy-MM-dd HH:mm:ss」,「2017-03-04 12:12:03」) Date dateTo = Date。解析( 「YYYY-MM-DD HH:MM:SS」, 「2017年6月1日12時12分03秒」)' 和 '日期dateFrom = Date.parse(「YYYY-MM-DD HH: mm:ss「,」2017-03-04 12:13:03「) Date dateTo = Date.parse(」yyyy-MM-dd HH:mm:ss「,」2017-06-01 12:12:03 「)' –

1

我@JonSkeet同意:你應該繼續使用喬達-時間。國際海事組織,Joda-Time和Groovy非常適合彼此。

你可以來(我能找到)最接近的將是使用額外的日期方法在Groovy JDK做到這一點:

int differenceInDays = start - end 

其計算兩個日期之間的差異。這讓你自己把日子變成月,這很糟糕。

堅持喬達時間。

0

正如Jon Skeet提到的那樣,您最好使用Joda-Time,然後圍繞這個主題進行包裝。

請注意,儘管Joda-Time在兩個日期之間返回整月的數字,包括適當處理夏令時。

1

如果您想要按月份名稱取得差異,而不是幾天和幾周,則可以執行此操作。

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

相關問題