2012-05-30 1 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 (который является довольно большой зависимость), почему вы не хотите использовать Joda Time? –

ответ

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

Не работает для меня ... Если дата начала - 7 декабря 2013 года, а дата окончания - 21 января 2014 года, результат равен 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

Для тех, кто придет сюда и увидит этот подход и подумает использовать его :) Не делайте этого. В качестве примера играйте с этими датами: 'Дата dateFrom = Date.parse (" yyyy-MM-dd HH: mm: ss "," 2017-03-04 12:12:03 ") Дата dateTo = Дата. parse («yyyy-MM-dd HH: mm: ss», «2017-06-01 12:12:03») ' и ' Дата dateFrom = Date.parse ("yyyy-MM-dd HH: mm: ss "," 2017-03-04 12:13:03 ") Дата dateTo = Date.parse (" yyyy-MM-dd HH: mm: ss "," 2017-06-01 12:12:03 «)' –

1

Я согласен с @JonSkeet: вы должны продолжать использовать Joda -Время. IMO, Joda-Time и Groovy отлично подходят друг другу.

Ближайшее что вы можете прийти (что я мог найти) будут использовать дополнительные методы Даты в Groovy JDK сделать это:

int differenceInDays = start - end 

, который вычисляет разницу между двумя датами в дни. Это позволит вам самостоятельно преобразовывать дни в месяцы, что отстойно.

Stick с Joda-Time.

0

Как упоминал Джон Скит, вам лучше использовать Joda-Time, а затем обернуть голову вокруг этой темы.

Следует помнить, что Joda-Time возвращает количество полных месяцев между двумя датами, включая правильную обработку летнего времени.

1

Если вы хотите получить разницу между месяцами по месяцу, вместо дней и недель, вы можете это сделать.

Ex: 7 декабря 2013 против 21 января 2014 даст вам разницу в 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