393 * @param include код, управляющий включением начальной и конечной дат
394 * в диапазон.
395 *
396 * @return
true
, если текущий объект SerialDate принадлежит
397 * заданному диапазону.
398 */
399 public boolean isInRange(final SerialDate d1, final SerialDate d2,
400 final int include) {
401 final int s1 = d1.toSerial();
402 final int s2 = d2.toSerial();
403 final int start = Math.min(s1, s2);
404 final int end = Math.max(s1, s2);
405
406 final int s = toSerial();
407 if (include == SerialDate.INCLUDE_BOTH) {
408 return (s >= start && s <= end);
409 }
410 else if (include == SerialDate.INCLUDE_FIRST) {
411 return (s >= start && s < end);
412 }
413 else if (include == SerialDate.INCLUDE_SECOND) {
414 return (s > start && s <= end);
415 }
416 else {
417 return (s > start && s < end);
418 }
419 }
420
421 /**
422 * Вычисляет порядковый номер по дню, месяцу и году.
423 *
424 * 1 января 1900 = 2.
425 *
426 * @param d день.
427 * @param m месяц.
428 * @param y год.
429 *
430 * @return порядковый номер для заданного дня, месяца и года.
431 */
432 private int calcSerial(final int d, final int m, final int y) {
433 final int yy = ((y - 1900) * 365) + SerialDate.leapYearCount(y - 1);
434 int mm = SerialDate.AGGREGATE_DAYS_TO_END_OF_PRECEDING_MONTH[m];
435 if (m > MonthConstants.FEBRUARY) {
436 if (SerialDate.isLeapYear(y)) {
437 mm = mm + 1;
438 }
439 }
440 final int dd = d;
441 return yy + mm + dd + 1;
442 }
443
444 /**
445 * Вычисляет день, месяц и год по порядковому номеру.
446 */
447 private void calcDayMonthYear() {
448
449 // Вычислить год по порядковому номеру
450 final int days = this.serial - SERIAL_LOWER_BOUND;
451 // Переоценка из-за проигнорированных високосных дней.
452 final int overestimatedYYYY = 1900 + (days / 365);
453 final int leaps = SerialDate.leapYearCount(overestimatedYYYY);
454 final int nonleapdays = days - leaps;
455 // Недооценка из-за переоцененных лет.
456 int underestimatedYYYY = 1900 + (nonleapdays / 365);
457
458 if (underestimatedYYYY == overestimatedYYYY) {
459 this.year = underestimatedYYYY;
460 }