547 public static int lastDayOfMonth(final int month, final int yyyy) {
548
549 final int result = LAST_DAY_OF_MONTH[month];
550 if (month != FEBRUARY) {
551 return result;
552 }
553 else if (isLeapYear(yyyy)) {
554 return result + 1;
555 }
556 else {
557 return result;
558 }
559
560 }
561
562 /**
563 * Создает новую дату, прибавляя заданное количество дней
564 * к базовой дате.
565 *
566 * @param days количество прибавляемых дней (может быть отрицательным).
567 * @param base базовая дата.
568 *
569 * @return новая дата.
570 */
571 public static SerialDate addDays(final int days, final SerialDate base) {
572
573 final int serialDayNumber = base.toSerial() + days;
574 return SerialDate.createInstance(serialDayNumber);
575
576 }
577
578 /**
579 * Создает новую дату, прибавляя заданное количество месяцев
580 * к базовой дате.
581 *
582 * Если базовая дата близка к концу месяца, результат может слегка
583 * смещаться: 31 мая + 1 месяц = 30 июня
584 *
585 * @param months количество прибавляемых месяцев (может быть отрицательным).
586 * @param base базовая дата.
587 *
588 * @return новая дата.
589 */
590 public static SerialDate addMonths(final int months,
591 final SerialDate base) {
592
593 final int yy = (12 * base.getYYYY() + base.getMonth() + months - 1)
594 / 12;
595 final int mm = (12 * base.getYYYY() + base.getMonth() + months - 1)
596 % 12 + 1;
597 final int dd = Math.min(
598 base.getDayOfMonth(), SerialDate.lastDayOfMonth(mm, yy)
599 );
600 return SerialDate.createInstance(dd, mm, yy);
601
602 }
603
604 /**
605 * Создает новую дату, прибавляя заданное количество лет
606 * к базовой дате.
607 *
608 * @param years количество прибавляемых лет (может быть отрицательным).
609 * @param base базовая дата.
610 *
611 * @return новая дата.
612 */
613 public static SerialDate addYears(final int years, final SerialDate base) {
614
615 final int baseY = base.getYYYY();
616 final int baseM = base.getMonth();
617 final int baseD = base.getDayOfMonth();
618
619 final int targetY = baseY + years;
620 final int targetD = Math.min(