Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
day = l + 28 — 31*(month/4) [month, day]enddate = 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.5. Вычисление n-ого дня недели в месяце
Иногда, зная год и месяц, хочется вычислить дату, скажем, третьего понедельника или второго вторника в этом месяце. Такую задачу решает код в листинге 7.1.
Чтобы найти n-ое вхождение данного дня недели, мы передаем n в качестве первого параметра. Второй параметр — номер дня недели (0 — воскресенье, 1 — понедельник и т.д.). Третий и четвертый параметры — месяц и год соответственно.
def nth_wday(n, wday, month, year) if (!n.between? 1,5) or (!wday.between? 0,6) or (!month.between? 1,12) raise ArgumentError end t = Time.local year, month, 1 first = t.wday if first == wday fwd = 1 elsif first < wday fwd = wday - first + 1 elsif first > wday fwd = (wday+7) - first + 1 end target = fwd + (n-1)*7 begin t2 = Time.local year, month, target rescue ArgumentError return nil end if t2.mday == target t2 else nil endendСтранный код в конце текста метода призван скорректировать давнюю традицию, принятую в функциях работы с датами. Если вы думаете, что попытка создать объект для представления 31 ноября приведет к ошибке, то разочарую вас. Почти все системы молчаливо преобразуют эту дату в 1 декабря. Если вы давным-давно программируете в UNIX, то, наверное, полагаете, что так и должно быть. Другие сочтут это ошибкой.
Не станем спорить о том, что должна делать системная библиотека и должен ли Ruby изменить это поведение. Но мы не хотим, чтобы наша процедура продолжала эту традицию. Если вы ищете, к примеру, пятую пятницу в ноябре 2000 года, то она вернет
nil7.6. Преобразование из секунд в более крупные единицы
Иногда нужно преобразовать заданное число секунд в дни, часы, минуты и секунды. Это можно сделать следующим образом:
def sec2dhms(seсs) time = seсs.round # Отбрасываем микросекунды. sec = time % 60 # Извлекаем секунды. time /= 60 # Отбрасываем секунды. mins = time % 60 # Извлекаем минуты. time /= 60 # Отбрасываем минуты. hrs = time % 24 # Извлекаем часы. time /= 24 # Отбрасываем часы. days = time # Дни (последний остаток). [days, hrs, mins, sec] # Возвращаем массив [d,h,m,s].endt = sec2dhms(1000000) # Миллион секунд равно...puts "#{t[0]} days," # 11 дней,puts "#{t[1]} hours," # 13 часов,puts "#{t[2]} minutes," # 46 минутputs " and #{t[3]} seconds." # и 40 секунд.Можно было пойти и дальше. Но неделю вряд ли назовешь полезной единицей, месяц не слишком точно определен, а год не всегда содержит одно и то же число дней.
Ниже приведена также обратная функция:
def dhms2sec(days,hrs=0,min=0,sec=0)days*86400 + hrs*3600 + min*60 + secend7.7. Вычисление промежутка времени, прошедшего от точки отсчета
По разным причинам может понадобиться перейти от внутреннего (традиционного) представления времени к стандартному. В системе время хранится как число секунд, прошедших с точки отсчета.
Метод класса
Time.atTimeepoch = Time.at(0) # Найти точку отсчета (1 января 1970 GMT)newmil = Time.at(978307200) # Счастливого миллениума! (1 января 2001)Обратная функция — это метод экземпляра
to_inow = Time.now # 16 Nov 2000 17:24:28sec = now.to_i # 974424268Если нужны микросекунды, и система поддерживает такую точность, то можно воспользоваться методом
to_f7.8. Високосные секунды
Хотите иметь дело с «високосными» секундами? Мой совет: не делайте этого.
