Когда оператор !
«логическое не» применяется к числовому значению в C или C ++, он дает следующий результат:
1
, если его операнд равен нулю 0
в противном случае Условное утверждение C if
интерпретирует 0
как «ложь», а любое ненулевое значение, включая 1
, как «истина». Поэтому ваш второй вариант верен.
Столько ответов с длинным кодом, когда можно просто сделать это с 1 строкой и некоторой математикой:
LocalDate from = yourdate;
LocalDate to = yourotherdate;
int difference = to.getMonthValue() - from.getMonthValue()) + ((to.getYear() - from.getYear()) * 12) + 1;
Помимо использования времени 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 .
Как говорят остальные, если есть библиотека, которая дает вам разницу во времени в месяцах, и вы можете ее использовать, то вы тоже можете.
В противном случае, если y1
и m1
- год и месяц первого числа, а y2
и m2
- год и месяц второго числа, затем значение, которое вы want is:
(y2 - y1) * 12 + (m2 - m1) + 1;
Обратите внимание, что средний член (m2 - m1) может быть отрицательным, даже если вторая дата стоит после первой, но это нормально.
Неважно, взяты ли месяцы с января = 0 или январь = 1, и не имеет значения, относятся ли годы к нашей эры, годы с 1900 года или что-то еще, если обе даты используют одну и ту же основу. Так, например, не смешивайте даты AD и BC, поскольку не было года 0 и, следовательно, BC смещен на 1 от AD.
You '
Мне пришлось написать эту реализацию, потому что у меня были определенные периоды, который мне пришлось искать в течение двух дат. Здесь вы можете определить собственный период и ввести логику для расчета.
Здесь 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;
}
}
с использованием 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 для простоты :)
Я бы настоятельно рекомендовал Joda-Time (и, начиная с Java 8, API времени Java) для этого.
Обратите внимание также на комментарии Ника Холта, приведенные ниже. переход на летнее время.
Вы можете использовать Календарь или Joda time для этого.
В Joda time вы можете использовать метод Days.daysBetween (). Затем вы можете рассчитать разницу в месяцах. Вы также можете использовать DateTime.getMonthOfYear () и выполнить вычитание (для дат в том же году).
Joda Time - довольно классная библиотека для даты и времени Java, которая может помочь вам добиться желаемого с помощью Period
s .