Книга: Программирование на языке Ruby

7.12. Проверка года на високосность

7.12. Проверка года на високосность

В классе Date есть два метода класса julian_leap? и gregorian_leap?, но только последний применим к относительно недавнему времени. Есть также метод leap?, но это просто синоним gregorian_leap?.

require "date"
flag1 = Date.julian_leap? 1700    # true
flag2 = Date.gregorian_leap? 1700 # false
flag3 = Date.leap? 1700           # false

Любой ребенок знает первое правило проверки на високосность: год должен делиться на 4. Меньшее число людей знают второе правило: год не должен делиться на 100. И уж совсем немногие знают про исключение из второго правила: если год делится на 400, то он високосный. Таким образом, последний год тысячелетия является високосным, только если делится на 400; так, 1900 год не был високосным, а 2000 был. (Эта поправка необходима, потому что в году не ровно 365.25 дней, а приблизительно 365.2422.)

В классе Time нет аналогичного метода, но при желании его легко можно добавить.

class Time
 def Time.leap? Year
  if year % 400 == 0
   true
  elsif year % 100 == 0
   false
  elsif year % 4 == 0
   true
  else
   false
 end
end

Я привел этот код только для того, чтобы прояснить алгоритм; конечно, гораздо проще вызвать метод Date.leap?. В моей реализации это метод класса по аналогии с классом Date, но можно было бы сделать его и методом экземпляра.

Оглавление книги

Оглавление статьи/книги

Генерация: 1.386. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз