Различие месяца Даты Java

Когда оператор ! «логическое не» применяется к числовому значению в C или C ++, он дает следующий результат:

  • 1, если его операнд равен нулю
  • 0 в противном случае

Условное утверждение C if интерпретирует 0 как «ложь», а любое ненулевое значение, включая 1, как «истина». Поэтому ваш второй вариант верен.

42
задан Lii 23 February 2018 в 15:14
поделиться

8 ответов

Столько ответов с длинным кодом, когда можно просто сделать это с 1 строкой и некоторой математикой:

LocalDate from = yourdate;
LocalDate to = yourotherdate;

int difference = to.getMonthValue() - from.getMonthValue()) + ((to.getYear() - from.getYear()) * 12) + 1;
-1
ответ дан 26 November 2019 в 23:15
поделиться

Помимо использования времени Joda, которое, кажется, является любимым предложением, я бы предложил следующий фрагмент:

public static final int getMonthsDifference(Date date1, Date date2) {
    int m1 = date1.getYear() * 12 + date1.getMonth();
    int m2 = date2.getYear() * 12 + date2.getMonth();
    return m2 - m1 + 1;
}

EDIT: Начиная с Java 8, существует более стандартный способ расчет такой же разницы. См. Мой альтернативный ответ с использованием вместо этого JSR-310 api .

36
ответ дан 26 November 2019 в 23:15
поделиться

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

В противном случае, если y1 и m1 - год и месяц первого числа, а y2 и m2 - год и месяц второго числа, затем значение, которое вы want is:

(y2 - y1) * 12 + (m2 - m1) + 1;

Обратите внимание, что средний член (m2 - m1) может быть отрицательным, даже если вторая дата стоит после первой, но это нормально.

Неважно, взяты ли месяцы с января = 0 или январь = 1, и не имеет значения, относятся ли годы к нашей эры, годы с 1900 года или что-то еще, если обе даты используют одну и ту же основу. Так, например, не смешивайте даты AD и BC, поскольку не было года 0 и, следовательно, BC смещен на 1 от AD.

You '

41
ответ дан 26 November 2019 в 23:15
поделиться

Мне пришлось написать эту реализацию, потому что у меня были определенные периоды, который мне пришлось искать в течение двух дат. Здесь вы можете определить собственный период и ввести логику для расчета.

Здесь TimePeriod - это POJO, у которого есть начало, конец, начало периода, конец периода

открытый класс Ежемесячно расширяет период {

public int getPeriodCount(String startDate, String endDate, int scalar) {
    int cnt = getPeriods(startDate, endDate, scalar).size();        
    return cnt;
}

public List getPeriods(String startDate, String endDate, int scalar) {

    ArrayList list = new ArrayList();

    Calendar startCal = CalendarUtil.getCalendar(startDate);
    Calendar endCal =  CalendarUtil.getCalendar(endDate);

    while (startCal.compareTo(endCal) <= 0) {
        TimePeriod period = new TimePeriod();
        period.setStartDate(startCal.getTime());
        period.setPeriodStartDate(getPeriodStartDate((Calendar) startCal.clone()).getTime());
        Calendar periodEndCal = getPeriodEndDate((Calendar) startCal.clone(), scalar);
        period.setEndDate(endCal.before(periodEndCal) ? endCal.getTime()    : periodEndCal.getTime());
        period.setPeriodEndDate(periodEndCal.getTime());

        periodEndCal.add(Calendar.DATE, 1);
        startCal = periodEndCal;
        list.add(period);
    }

    return list;
}


private Calendar getPeriodStartDate(Calendar cal) {     
    cal.set(Calendar.DATE, cal.getActualMinimum(Calendar.DATE));        
    return cal;
}

private Calendar getPeriodEndDate(Calendar cal, int scalar) {

    while (scalar-- > 0) {
        cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
        if (scalar > 0)
            cal.add(Calendar.DATE, 1);          
    }

    return cal;
}

}

1
ответ дан 26 November 2019 в 23:15
поделиться

с использованием joda time будет примерно так (я сравнил, сколько месяцев между сегодняшним днем ​​и 20 декабря 2012 года)

import org.joda.time.DateTime ;
import org.joda.time.Months;

DateTime x = new DateTime().withDate(2009,12,20); // doomsday lol

Months d = Months.monthsBetween( new DateTime(), x);
int monthsDiff = d.getMonths();

Результат: 41 месяц (с 6 июля 2009 года) )

должно быть легко? :)

ps: дату можно также преобразовать с помощью SimpleDateFormat например:

Date x = new SimpleDateFormat("dd/mm/yyyy").parse("20/12/2009");
DateTime z = new DateTime(x);

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

8
ответ дан 26 November 2019 в 23:15
поделиться

Я бы настоятельно рекомендовал Joda-Time (и, начиная с Java 8, API времени Java) для этого.

  1. Это делает работу такого рода очень простой (см. Periods ).
  2. Он не страдает от проблем с потоками, которые беспокоят текущие объекты даты / времени (я думаю о форматерах, особенно )
  3. Это основа новых API даты / времени Java, которые будут поставляться с Java 7 (так что вы изучаете что-то, что станет стандартом)

Обратите внимание также на комментарии Ника Холта, приведенные ниже. переход на летнее время.

30
ответ дан 26 November 2019 в 23:15
поделиться

Вы можете использовать Календарь или Joda time для этого.

В Joda time вы можете использовать метод Days.daysBetween (). Затем вы можете рассчитать разницу в месяцах. Вы также можете использовать DateTime.getMonthOfYear () и выполнить вычитание (для дат в том же году).

2
ответ дан 26 November 2019 в 23:15
поделиться

Joda Time - довольно классная библиотека для даты и времени Java, которая может помочь вам добиться желаемого с помощью Period s .

2
ответ дан 26 November 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: