Книга: Программирование на языке Ruby
7.4. Определение даты Пасхи
7.4. Определение даты Пасхи
Дату этого праздника всегда было сложно вычислить, так как она привязана к лунному календарю. Солнечный год не делится нацело на лунные месяцы, поэтому даты, основанные на таком исчислении времени, будут из года в год меняться.
Представленный ниже алгоритм хорошо известен с давних времен. Мы видели его реализацию на языках BASIC, Pascal и С. А теперь перевели и на Ruby:
def easter(year)
с = year/100
n = year - 19*(year/19)
k = (c-17)/25
i = с - c/4 - (c-k)/3 + 19*n + 15
i = i - 30*(i/30)
i = i - (i/28)* (1 -(i/28)*(29/(i + 1))*((21-n)/11))
j = year + year/4 + i + 2 - с + c/4
j = j - 7*(j/7)
l = i - j
month = 3 + (1+40)/44
day = l + 28 — 31*(month/4)
[month, day]
end
date = easter 2001 # Найти месяц и день для 2001 года,
date = [2001] + date # Добавить в начало год.
t = Time.local *date # Передать параметры Time.local.
puts t # Sun Apr 15 01:00:00 GMT-8:00 2001
Кто-то, прочитав этот раздел о Пасхе, непременно спросит: «Церковная или астрономическая?» Честно говоря, не знаю. Если вам удастся выяснить, сообщите всем нам.
Я бы с удовольствием объяснил вам этот алгоритм, только вот сам его не понимаю… Что-то надо принимать на веру, а в данном случае это особенно уместно!
- 7.1. Определение текущего момента времени
- 7.2. Работа с конкретными датами (после точки отсчета)
- 7.3. Определение дня недели
- 7.4. Определение даты Пасхи
- 7.5. Вычисление n-ого дня недели в месяце
- 7.6. Преобразование из секунд в более крупные единицы
- 7.7. Вычисление промежутка времени, прошедшего от точки отсчета
- 7.8. Високосные секунды
- 7.9. Определение порядкового номера дня в году
- 7.10. Контроль даты и времени
- 7.11. Определение недели в году
- 7.12. Проверка года на високосность
- 7.13. Определение часового пояса
- 7.14. Манипулирование временем без даты
- 7.15 Сравнение моментов времени
- 7.16 Прибавление интервала к моменту времени
- 7.17. Вычисление разности между двумя моментами времени
- 7.18. Работа с конкретными датами (до точки отсчета)
- 7.19. Взаимные преобразования объектов Date, Time и DateTime
- 7.20. Извлечение даты и времени из строки
- 7.21. Форматирование и печать даты и времени
- 7.22. Преобразование часовых поясов
- 7.23. Определение числа дней в месяце
- 7.24. Разбиение месяца на недели
- 7.25. Заключение
- 7.1. Определение текущего момента времени
- 7.21. Форматирование и печать даты и времени
- 7.23. Определение числа дней в месяце
- 7.11. Определение недели в году
- 7.9. Определение порядкового номера дня в году
- 6.1.3. Форматирование даты и времени
- 7.13. Определение часового пояса
- 1.2. Определение количества информации. Единицы измерения количества информации
- Определение версии клиента
- Определение пользовательского формата числовых данных
- Определение целей. Построение цепочек
- Определение необходимого системного вызова