Какова хорошая структура данных для периодических или повторяющихся дат? - PullRequest
10 голосов
/ 18 июня 2009

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

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

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

Ответы [ 3 ]

6 голосов
/ 18 июня 2009

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

0 голосов
/ 18 июня 2009

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

0 голосов
/ 18 июня 2009

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

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

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

...