7.5. Вычисление n-ого дня недели в месяце
7.5. Вычисление n-ого дня недели в месяце
Иногда, зная год и месяц, хочется вычислить дату, скажем, третьего понедельника или второго вторника в этом месяце. Такую задачу решает код в листинге 7.1.
Чтобы найти n-ое вхождение данного дня недели, мы передаем n в качестве первого параметра. Второй параметр — номер дня недели (0 — воскресенье, 1 — понедельник и т.д.). Третий и четвертый параметры — месяц и год соответственно.
Листинг 7.1. Вычисление n-ого дня недели в месяце
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
end
end
Странный код в конце текста метода призван скорректировать давнюю традицию, принятую в функциях работы с датами. Если вы думаете, что попытка создать объект для представления 31 ноября приведет к ошибке, то разочарую вас. Почти все системы молчаливо преобразуют эту дату в 1 декабря. Если вы давным-давно программируете в UNIX, то, наверное, полагаете, что так и должно быть. Другие сочтут это ошибкой.
Не станем спорить о том, что должна делать системная библиотека и должен ли Ruby изменить это поведение. Но мы не хотим, чтобы наша процедура продолжала эту традицию. Если вы ищете, к примеру, пятую пятницу в ноябре 2000 года, то она вернет nil (а не 1 декабря 2000 года).
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКДанный текст является ознакомительным фрагментом.
Читайте также
7.3. Определение дня недели
7.3. Определение дня недели Есть несколько способов определить день недели. Во-первых, метод экземпляра to_a возвращает массив, содержащий всю информацию о моменте времени. Можно обратиться к его седьмому элементу; это число от 0 до 6, причем 0 соответствует воскресенью, а 6 —
7.11. Определение недели в году
7.11. Определение недели в году Что такое «порядковый номер недели», не вполне ясно. Разные компании, коалиции, правительственные учреждения и органы стандартизации по-разному определяют это понятие. Путаница связана с тем, что год может начинаться с любого дня недели. Все
7.24. Разбиение месяца на недели
7.24. Разбиение месяца на недели Представьте, что нужно разбить месяц на недели, например чтобы напечатать календарь. Эту задачу решает приведенный ниже код. Возвращаемый массив состоит из подмассивов, по семь элементов в каждом. При этом первому элементу каждого
2.3.9. Вычисление размера БД
2.3.9. Вычисление размера БД ERwin позволяет рассчитать приблизительный размер БД в целом, а также таблиц, индексов и других объектов через определенный период времени после начала эксплуатации ИС. Для расчета размеров физических объектов служит диалог Volumetrics Editor (рис. 2.99),
ВОПРОС НЕДЕЛИ: Существуют ли какие-либо системы для повышения вероятности выигрыша?
ВОПРОС НЕДЕЛИ: Существуют ли какие-либо системы для повышения вероятности выигрыша? Сергей Пильгуйменеджер по связям с общественностью компании «Русское Казино»Подобных систем довольно много - для каждой игры свои. Профессионалы предпочитают играть в блэкджек или
ВОПРОС НЕДЕЛИ: Каким вы видите компьютер будущего?
ВОПРОС НЕДЕЛИ: Каким вы видите компьютер будущего? xarkonnenдизайнер в рекламном агентствеКак невидимую и неощутимую часть информационной среды. Мозговой нанобиотехнологический имплантат, взаимодействующий с прочими имплантатами и внешними устройствами и датчиками.
ВОПРОС НЕДЕЛИ: Компьютерное моделирование общественного развития — это секретное оружие или шарлатанство?
ВОПРОС НЕДЕЛИ: Компьютерное моделирование общественного развития — это секретное оружие или шарлатанство? Александр Варшавскийдоктор экономических наук, профессор, заведующий лабораторией ЦЭМИ РАНМатематические модели общественного развития — это не секретное
ВОПРОС НЕДЕЛИ К каким последствиям может привести …
ВОПРОС НЕДЕЛИ К каким последствиям может привести … …распространение на компьютерный бизнес борьбы с «серым» импортом, подобно той, что ведется сейчас на рынке мобильных телефонов?Артем Емельяновменеджер по маркетингу ISM ComputersК самым неприятным для простого
Кафедра Ваннаха: Удивительные приключения недели
Кафедра Ваннаха: Удивительные приключения недели Ну, то, что Россия в прошлом веке перешла на григорианский календарь, знают многие. Произошло это в соответствии с «Декретом о введении в Российской республике западноевропейского календаря», принятом 24 января 1918 г.
Через три недели Diaspora постарается убить соцсети Михаил Карпов
Через три недели Diaspora постарается убить соцсети Михаил Карпов Опубликовано 27 августа 2010 года Разработчики опенсорсной «альтернативы Facebook» под названием Diaspora собираются запустить проект через три недели.Проект Diaspora зародился на волне шумихи о
+Две недели: Хакер возвращается
+Две недели: Хакер возвращается Двумя неделями позднее хакер вновь всплыл в сети TransWorld. На этот раз хакер переписал на их сервер программу, которая при исполнении могла пересылать по почте файл с паролями на другую систему в Интернете. Вначале Натан не мог понять, как
+Три недели: Усиление защиты
+Три недели: Усиление защиты Взломы продолжались. Время от времени хакер (или хакеры!) запросто заходил из Интернета. Каждый раз, когда Натан затыкал одну дыру в защите, хакер быстро находил другую. К этому времени сотрудники TransWorld работали в режиме реагирования. Они
ВОПРОС НЕДЕЛИ: Что гарантирует логотип известной компании розничному покупателю?
ВОПРОС НЕДЕЛИ: Что гарантирует логотип известной компании розничному покупателю? Николай РадовскийPR-представитель ATI Technologies в России и СНГЛоготип любой известной IT-компании говорит о двух ключевых характеристиках продукта — качестве и технологическом уровне. При этом
Фултон Хэл
Просмотр ограничен
Смотрите доступные для ознакомления главы 👉