Чистый код. Создание, анализ и рефакторинг — страница 71 из 94

379      * 

380      * Строка возвращается в форме длинного названия месяца

381      * из локального контекста по умолчанию.

382      *

383      * @param month  месяц.

384      *

385      * @return строка, представляющая заданный месяц.

386      */


Листинг Б.1 (продолжение)

387     public static String monthCodeToString(final int month) {

388

389         return monthCodeToString(month, false);

390

391     }

392

393     /**

394      * Возвращает строку, представляющую заданный месяц.

395      * 

396      * Строка возвращается в форме длинного или короткого названия месяца

397      * из локального контекста по умолчанию.

398      *

399      * @param month  месяц.

400      * @param shortened  если true возвращает сокращенное

401      *                   название месяца.

402      *

403      * @return строка, представляющая заданный месяц.

404      * @throws java.lang.IllegalArgumentException

405      */

406     public static String monthCodeToString(final int month,

407                                            final boolean shortened) {

408

409         // Проверка аргументов...

410         if (!isValidMonthCode(month)) {

411             throw new IllegalArgumentException(

412                 "SerialDate.monthCodeToString: month outside valid range.");

413         }

414

415         final String[] months;

416

417         if (shortened) {

418             months = DATE_FORMAT_SYMBOLS.getShortMonths();

419         }

420         else {

421             months = DATE_FORMAT_SYMBOLS.getMonths();

422         }

423

424         return months[month - 1];

425

426     }

427

428     /**

429      * Преобразует строку в код месяца.

430      * 

431      * Метод возвращает одну из констант JANUARY, FEBRUARY, ...,

432      * DECEMBER, соответствующую заданной строке. Если строка не распознается,

433      * метод возвращает -1.

434      *

435      * @param s  строка для обработки.

436      *

437      * @return -1, если строка не разбирается, месяц года

438      *         в противном случае.

439      */

440     public static int stringToMonthCode(String s) {

441

442         final String[] shortMonthNames = DATE_FORMAT_SYMBOLS.getShortMonths();

443         final String[] monthNames = DATE_FORMAT_SYMBOLS.getMonths();

444

445         int result = -1;

446         s = s.trim();

447

448         // Сначала пытаемся разобрать строку как целое число (1–12)...

449         try {

450             result = Integer.parseInt(s);

451         }

452         catch (NumberFormatException e) {

453             // Подавление

454         }

455

456         // Теперь ищем по названиям месяцев...

457         if ((result < 1) || (result > 12)) {

458             for (int i = 0; i < monthNames.length; i++) {

459                 if (s.equals(shortMonthNames[i])) {

460                     result = i + 1;

461                     break;

462                 }

463                 if (s.equals(monthNames[i])) {

464                     result = i + 1;

465                     break;

466                 }

467             }

468         }

469

470         return result;

471

472     }

473

474     /**

475      * Возвращает true, если целое число code представляет действительную

476      * неделю месяца, или false в противном случае.

477      *

478      * @param code  код, проверяемый на действительность.

479      * @return true, если целое число code представляет

480      *         действительную неделю месяца.

481      */

482     public static boolean isValidWeekInMonthCode(final int code) {

483

484         switch(code) {

485             case FIRST_WEEK_IN_MONTH:

486             case SECOND_WEEK_IN_MONTH:

487             case THIRD_WEEK_IN_MONTH:


Листинг Б.1 (продолжение)

488             case FOURTH_WEEK_IN_MONTH:

489             case LAST_WEEK_IN_MONTH: return true;

490             default: return false;

491         }

492

493     }

494

495     /**

496      * Определяет, является ли заданный год високосным.

497      *

498      * @param yyyy  год (в диапазоне от 1900 до 9999).

499      *

500      * @return true, если заданный код является високосным.

501      */

502     public static boolean isLeapYear(final int yyyy) {

503

504         if ((yyyy % 4) != 0) {

505             return false;

506         }

507         else if ((yyyy % 400) == 0) {

508             return true;

509         }

510         else if ((yyyy % 100)