Рассчитать разницу в месяцах между двумя датами с 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 времени это действительно легко достичь с помощью чего-то вроде этого:

months = Months.monthsBetween(start, end).getMonths()

Как я могу достичь этого в Groovy, не используя другие библиотеки?

 Jon Skeet30 мая 2012 г., 18:06
Если вы уже используете Groovy (это довольно большая зависимость), зачем вамnot хотите использовать Joda Time?

Ответы на вопрос(5)

а не по дням и неделям, вы можете сделать это.

Пример: 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

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

вы должны продолжать использовать Joda-Time. IMO, Joda-Time и Groovy отлично подходят друг другу.

Самое близкое, что вы можете прийти (что я мог бы найти), это использовать дополнительные методы Date вGroovy JDK сделать это:

int differenceInDays = start - end

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

Придерживайтесь Joda-Time.

Решение Вопроса
monthBetween = (start[Calendar.MONTH] - end[Calendar.MONTH]) + 1
yearsBetween = start[Calendar.YEAR] - end[Calendar.YEAR]
months = monthBetween + (yearsBetween * 12)
 25 июн. 2015 г., 16:41
У меня не работает ... Если дата начала - 7 декабря 2013 г., а дата окончания - 21 января 2014 г., вывод - 0. Я думаю, что это решение предполагает, что дата начала всегда будет позже даты окончания

вероятно, менее читабелен и использует больше ресурсов), вы также можете сделать:

months = (start..end).collect { [ it[ Calendar.YEAR ], it[ Calendar.MONTH ] ] }
                     .unique()
                     .size() 
 01 мар. 2017 г., 13:17
Для того, кто придет сюда и увидит этот подход и подумает использовать его :) Не делайте этого. Как пример игры с этими датами:Date dateFrom = Date.parse("yyyy-MM-dd HH:mm:ss", "2017-03-04 12:12:03") Date dateTo = Date.parse("yyyy-MM-dd HH:mm:ss", "2017-06-01 12:12:03")  а такжеDate 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")

Ваш ответ на вопрос