Какая хорошая структура данных для периодических или повторяющихся дат?

Существует ли опубликованная структура данных для хранения периодических или повторяющихся дат? Что-то, что может обрабатывать:

  • Насос нуждается в утилизации каждые пять дней.
  • День выплаты жалованья - каждую вторую пятницу.
  • День благодарения - второй понедельник октября (США: четвертый четверг ноября).
  • День Святого Валентина - каждый 14 февраля.
  • Солнцестояние (обычно) каждые 21 июня и 21 декабря.
  • Пасха - это воскресенье после первой полнолуния в день или после дня весеннего равноденствия (ладно, это немного растягивается).

Я считаю, что cron внутренняя структура данных может обрабатывать # 1, # 4, # 5 (два правила) и, возможно, # 2, но я не смотрел на нее. MS Outlook и другие календари, похоже, могут обрабатывать первые пять, но у меня нет этого исходного кода.

Ответ 1

Используйте библиотеку реализации iCalendar, такую ​​как: ruby, java, php, python, .net и java, а затем добавить поддержку для расчета специальных дат.

Ответ 2

Со всеми этими вариациями в способе, которым вы указываете повторение, я бы уклонился от одной реализации структуры данных, чтобы удовлетворить все 5 сценариев.

Вместо этого я бы (и имел для предыдущего проекта) построил простые структуры, которые обращаются к каждому типу повторения. Вы можете обернуть их все так, чтобы они были похожи на единую структуру данных, но под капотом они могли делать все, что захотят. Внедряя интерфейс, я смог обрабатывать каждый тип повторения аналогичным образом, поэтому он чувствовал себя как структура данных для всех размеров. Я мог бы спросить любой экземпляр для всех дат повторения в течение определенного периода времени, и это сделало трюк.

Я также хотел бы узнать больше о том, как эти даты нужно использовать, прежде чем приступать к конкретной реализации.

Ответ 3

Если вы хотите создать структуру данных, я бы рекомендовал хеш-таблицу (где праздники или событие являются ключами с новым вводом даты в качестве значения), если есть кратности каждого события, вы можете использовать хэш значение, которое находит раздел в связанном списке, который затем имеет список всех вхождений (это сделало бы поиск, а также прогон вставки в O (1)).