Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Точка отсчета (epoch) — термин, пришедший из мира UNIX. В этой системе время обычно хранится как число секунд, прошедших с определенного момента (называемого точкой отсчета), а именно с полуночи 1 января 1970 года по Гринвичу.
(Отметим, что во временных поясах США точкой отсчета оказывается 31 декабря предыдущего года). Тем же словом обозначается не только начальный момент, но и время, прошедшее с этого момента.
Для выполнения большинства операций используется класс
TimeDateDateTime7.1. Определение текущего момента времени
Самый главный вопрос при манипуляциях с датами и временем: какой сегодня день и сколько сейчас времени? В Ruby при создании объекта класса
Timet0 = Time.newСинонимом служит
Time.now: t0 = Time.nowОтметим, что разрешающая способность системного таймера на разных машинах различна. Иногда это микросекунды; в таком случае два объекта
Time7.2. Работа с конкретными датами (после точки отсчета)
Большинству программ нужно работать только с датами, относящимися к будущему или недавнему прошлому. Для таких целей класса
TimemktimelocalgmutcМетод
mktimeTimet1 = Time.mktime(2001) # 1 января 2001 года, 0:00:00t2 = Time.mktime(2001,3)t3 = Time.mktime(2001,3,15)t4 = Time.mktime(2001,3,15,21)t5 = Time.mktime(2001,3,15,21,30)t6 = Time.mktime(2001,3,15,21,30,15) # 15 марта 2001 года, 21:30:15Отметим, что в методе
mktimeime.localt7 = Time.local(2001,3,15,21,30,15) # 15 марта 2001 года, 21:30:15Метод
Time.gmt8 = Time.gm(2001,3,15,21,30,15) # March 15, 2001 21:30:15 pm# Это 13:30:15 по центральному времени!У этого метода есть синоним
Time.utct9 = Time.utc(2001,3,15,21,30,15) # March 15, 2001 21:30:15 pm# Снова 13:30:15 по центральному времени.Отметим одну важную вещь. Все эти методы могут принимать и альтернативный набор параметров. Метод экземпляра
to_a0..61..366truefalset0 = Time.local(0,15,3,20,11,1979,2,324,false,"GMT-8:00")t1 = Time.gm(*Time.now.to_a)Однако, глядя на первый пример, не думайте, что вы сможете изменить вычисляемые параметры, например день недели (в данном случае 2 означает вторник). Такое действие противоречило бы принципам организации календаря, поэтому на созданном объекте
TimeИ наконец, отметим, что есть много способов задать время некорректно, например указав тринадцатый месяц или 35-й день месяца. При любой подобной попытке возникнет исключение
ArgumentError7.3. Определение дня недели
Есть несколько способов определить день недели. Во-первых, метод экземпляра
to_atime = Time.nowday = time.to_a[6] # 2 (вторник)Еще лучше воспользоваться методом экземпляра
wdayday = time.wday # 2 (вторник)Но и тот, и другой способ не очень удобны. Иногда нужно получить день недели в виде числа, но чаще нас интересует его название в виде строки. Для этого можно обратиться к методу
strftimeday = time.strftime("%а") # "Tue"Можно получить и полное название:
long = time.strftime("%А") # "Tuesday"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
