Неделя между двумя датами Java + Joda Time - PullRequest
4 голосов
/ 03 марта 2012

Я хотел получить количество недель и месяцев между двумя диапазонами дат в Java. Например, Дата начала: 03/01/2012 Дата окончания: 03.05.2012

Поскольку две даты попадают в две разные недели, я хочу, чтобы результат был 2 вместо 0.

Вторая часть проблемы: Дата начала: 29.02.2012 Дата окончания: 03.01.2012

Количество месяцев между ними должно быть 2.

Я искал в Интернете по этому поводу, и многие люди рекомендовали использовать Joda Date time на Java. Так что я дал ему шанс. Я смог заставить недели работать, но я не уверен, что это правильный путь. Вот что я делаю, чтобы получить продолжительность недели:

    DateTime s = new DateTime(Long.parseLong("1330573027000")); // 2012-02-29
    DateTime e = new DateTime(Long.parseLong("1331005027000")); // 2012-03-05   

    Weeks weeks = Weeks.weeksBetween(s, e).plus(1);

Возвращает 1, когда я ожидаю 2, поскольку две даты в разные недели.

В течение нескольких месяцев я пытался следовать одному и тому же, но он возвращает 0, но я хочу, чтобы он возвращал 2, так как две даты в двух разных месяцах.

Может ли кто-нибудь указать мне правильное направление?

Спасибо!

Edit: Я думаю, у меня есть один способ сделать это, пожалуйста, дайте мне знать, если это выглядит правильно:

    DateTime start = new DateTime(Long.parseLong("1330659427000"));
    DateTime start = new DateTime(Long.parseLong("1331005027000"));

    DateTime finalStart = start.dayOfWeek().withMinimumValue();
    DateTime finalEnd   = end.dayOfWeek().withMaximumValue();

А затем получите разницу между finalStart и finalEnd. Это выглядит правильно?

Edit2 Обновлено время окончания

Ответы [ 2 ]

6 голосов
/ 17 июня 2014

JodaTime Weeks.weeksBetween (s, e) возвращает только количество целых недель. Неполные недели не учитываются. Чтобы решить эту проблему, вы должны гарантировать, что дни в начале и в конце недели. Попробуйте это:

int weeks = Weeks.weeksBetween(s.dayOfWeek().withMinimumValue().minusDays(1), 
            e.dayOfWeek().withMaximumValue().plusDays(1)).getWeeks();

MinusDays / plusDays гарантируют, что недели, которые я пытаюсь считать, полны.

Та же логика применима для месяцев:

int months = Months.monthsBetween(s.dayOfMonth().withMinimumValue().minusDays(1),
             e.dayOfMonth().withMaximumValue().plusDays(1)).getMonths();
0 голосов
/ 03 марта 2012
    int OFFSET_ONE = 1;

    DateTime t1 = new DateTime().withDate(2012, 02, 29).withDayOfWeek(1);
    DateTime t2 = new DateTime().withDate(2012, 03, 05).withDayOfWeek(7);

    int week1 = t2.weekOfWeekyear().get(); 
    int week2 = t1.weekOfWeekyear().get();

    System.out.println(week1-week2+OFFSET_ONE); // add OFFSET_ONE

это дает то, что вы после?

...