Учитывая диапазон дат (даты начала и окончания), как я могу подсчитать дни, исключая указанные дни недели в .Net? - PullRequest
2 голосов
/ 25 сентября 2008

Я создаю пользовательский интерфейс, который позволяет пользователю выбирать диапазон дат и отмечать или снимать отметки с дней недели, которые применяются в этом диапазоне дат.

Регуляторы диапазона дат: DateTimePickers, а дни недели CheckBoxes

Вот макет интерфейса:

From Date: (dtpDateFrom)
To Date: (dtpDateTo)

[y] Monday, [n] Tuesday, [y] Wednesday, (etc)

Как лучше всего подсчитать общее количество дней, основываясь не только на диапазоне дат, но и на отмеченных (или выбранных) днях недели?

Является ли циклическое переключение диапазона дат моей единственной опцией?

Ответы [ 2 ]

5 голосов
/ 25 сентября 2008

Вот как бы я подошел к этому:

  • Найти день недели (dow) первой и последней даты
  • Переместить первый день вперед до того же самого индекса, что и последний. Количество дней в магазине, которое должно быть включено
  • Рассчитать количество недель между первым и последним
  • Рассчитать количество включенных дней в неделе * количество недель + перенесенных включенных дней

как псевдокод:

 moved = start + end_dow - start_dow
 extras = count included days between start and moved
 weeks = ( end - moved ) / 7
 days = days_of_week_included * weeks + extras

Это займет постоянное время, независимо от того, как далеко друг от друга начальный и конечный дни.

Детали реализации этого алгоритма зависят от того, какой язык и библиотеки вы используете. По возможности я использую C ++ плюс boost :: date_time для такого рода вещей.

2 голосов
/ 25 сентября 2008

Цикл не будет вашим единственным вариантом - вы можете выполнить вычитание , чтобы вычислить общее количество дней, и вычитать по одному для каждой из ваших "пропущенных" дат в интервале между неделями, который содержит один из тех дней. К тому времени, когда вы выясните, наступит ли день на одну из неполных недель в начале или конце диапазона, и добавите #weeks * skipped days in a week, ваш код будет более сложным, чем если бы его просто посчитали, но если вы ожидаете чтобы иметь огромные диапазоны дат, он мог бы работать лучше.

На вашем месте я написал бы простой вариант зацикливания и переписал бы его, если бы оказалось, что профилирование показало, что оно является узким местом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...