Какой должна быть логика календаря с повторяющимися датами?
Какой должна быть логика календаря, в котором у событий может быть продолжительность, повторяемость (раз в день, неделю, месяц, в будни/выходные, каждую 2-ю среду месяца, каждый 1-й понедельник года), исключения из повторяемости (работа по будням, но исключая праздники) и т.п.?
Как в представленной логике делать выборку, допустим, 5 ближайших событий?
Логика классов. Назначаете классы интересующим дням. Классам прописаны требуемые свойства. Если нужно какие либо свойства определенному дню добавить, добавляем соответствующий класс. Например хотим исключить 23 мая 2017 года из повторения, то просто добавляем к нему класс например .exception которому уже заданы соответствующие параметры.
Как в представленной логике делать выборку, допустим, 5 ближайших событий?
А как делается выборка в массиве данных? Календарь это двумерный массив данных, ну или таблица по простому.
В цикле перебираются элементы массива и выводятся элементы с требуемым классом или классами.
В вопросе я подразумевал, что даты хранятся в БД и извлекаются выборочно. У вас же получается требуется в памяти хранить все возможные даты. По-моему это не может быть корректным решением для более-менее большого проекта.