Как рассчитать разницу ТОЛЬКО в месяцах, используя Java Joda API - PullRequest
9 голосов
/ 18 сентября 2011

Я пишу программу, которая должна просто рассчитывать месяцы между двумя указанными датами и возвращать значение программе.Например, если мне нужно вычислить количество месяцев между 1 апреля и 30 июня (то есть квартал, 3 месяца), и я использую следующий код:

    DateTime start = new DateTime().withDate(2011, 4, 1);
    DateTime end = new DateTime().withDate(2011, 6, 30);

    Months mt = Months.monthsBetween(start, end);
    int monthDiff = mt.getMonths();

Используя это, я все ещеполучить «2» как количество месяцев, тогда как на самом деле это «3» месяца.Это пример того, что я хочу.Я только вычисляю количество месяцев (то есть с 1-го числа начального месяца до последней даты последнего месяца) и мне не нужен дополнительный анализ, например дни, недели, часы и т. Д. Как мне этого добиться?

Любая помощь будет оценена.

Ответы [ 6 ]

9 голосов
/ 18 сентября 2011
DateTime start = new DateTime().withDate(2011, 4, 1);
DateTime end = new DateTime().withDate(2011, 6, 30);
Period p = new Period(start, end, PeriodType.months().withDaysRemoved());
int months = p.getMonths() + 1;

Вам нужна часть withDaysRemoved(), чтобы убедиться, что добавление одного к числу месяцев работает.В противном случае две даты, такие как 2011-04-15 и 2011-06-14, все равно приведут к ответу 2

3 голосов
/ 18 сентября 2011

Почему вы ожидаете, что ответ будет 3 months?Точный ответ: два месяца и чуть-чуть , что приводит к получению двух месяцев .

Если вы хотите количество месяцевкоторые «тронуты» этим интервалом , это совершенно другой вопрос. Просто добавьте 1 к результату разницы.

2 голосов
/ 18 сентября 2011
Months mt = Months.monthsBetween(
    start.monthOfYear().roundFloorCopy(), 
    end.monthOfYear().roundCeilingCopy()
);
1 голос
/ 21 октября 2013
DateTime start = new DateTime().withDate(2011, 4, 1);
        DateTime end = new DateTime().withDate(2011, 2, 1);
        Period p = new Period(start, end, PeriodType.months().withDaysRemoved());
        int months = p.getMonths();
        System.out.println(months);


wrong output in this case
1 голос
/ 18 сентября 2011

Пусть y1 и m1 будут годом и месяцем даты начала, и y2 и m2 - год и месяц даты окончания. Тогда количество месяцев между начало и конец, включая месяцы даты начала и окончания

(y2 - y1) * 12 + (m2 - m1) + 1
1 голос
/ 18 сентября 2011

Алгоритм Joda правильно посчитал разницу между этими двумя датами. Этот псевдокод будет самым простым способом объяснить, как он работает:

// (1)
monthsBetween(2011.6.14, 2011.4.15) = 1
monthsBetween(2011.6.15, 2011.4.15) = 2
// (2)
monthsBetween(2011.6.30, 2011.4.1) = 2
monthsBetween(2011.7.1,  2011.4.1) = 3

Чтобы сделать то, что вы хотите, вам нужно «улучшить» алгоритм joda:

  • Подсчет расстояния между двумя датами (используйте обычные месяцы между)
  • Если у вас есть конкретная ситуация: последний день месяца в одну дату и 1-й день месяца во вторую дату, добавьте +1 к окончательному результату.
...