Алгоритм расчета количества двухнедельных событий за данный календарный месяц - PullRequest
2 голосов
/ 28 октября 2010

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

, т. Е. Для серии "Каждый второй четверг с 7 октября 2010 года"«события» падают (7 октября 2010 года, 21 октября, 4 ноября, 18 ноября, 2 декабря, 16 декабря, 30 декабря, ...)

Итак, что мне нужно, так это функция

function(seriesDefinition, month) -> integer 

where:
    - seriesDefinition is some date that is a valid date in the series,
    - month indicates a month and a year

таким образом, что он точно выдает: numberFortnightlyEventsInSeriesThatFallInCalendarMonth

Примеры:

NumberFortnightlyEventsInMonth ('7 октября 2010,' окт 2010 ') -> 2

NumberFortnightlyE('7 октября 2010 г.,' ноябрь 2010 г.) -> 2

NumberFortnightlyEventsInMonth ('7 октября 2010 г., декабрь 2010 г.) -> 3

Обратите внимание, что в октябре 2 события, в ноябре - 2события, но декабрь имеет 3 события.


Предпочитается Psuedocode.

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

Ответы [ 3 ]

0 голосов
/ 29 октября 2010

Ну, для алгоритма, о котором вы говорите, обычным решением является вычисление номера дня, начиная с некоторой фиксированной даты.(Количество дней плюс накопленное количество дней в предыдущих месяцах плюс количество лет * 365 минус (число года / 4) плюс (число года / 100) минус (число года / 400))

Имеяэто, вы можете легко реализовать то, что вам нужно.Вам необходимо рассчитать, какой день недели был 1 января. Затем вы можете легко увидеть, каково число «каждые вторые четверги» с этого дня до 1 октября 2010 года и 1 декабря 2010 года. Их разница - это значение, которое вы ищете.

0 голосов
/ 07 ноября 2010

Мое решение ...

Public Function NumberFortnightlyEventsInMonth(seriesDefinition As Date, month As String) As Integer

    Dim monthBeginDate As Date
    monthBeginDate = DateValue("1 " + month)
    Dim lastDateOfMonth  As Date
    lastDateOfMonth = DateAdd("d", -1, DateAdd("m", 1, monthBeginDate))

    ' Step 1 - How many days between seriesDefinition and the 1st of [month]
    Dim daysToMonthBegin As Integer
    daysToMonthBegin = DateDiff("d", seriesDefinition, monthBeginDate)

    ' Step 2 - How many fortnights (14 days) fit into the number from Step 1?  Round up to the nearest whole number.
    Dim numberFortnightsToFirstOccurenceOfSeriesInMonth As Integer
    numberFortnightsToFirstOccurenceOfSeriesInMonth = (daysToMonthBegin \ 14) + IIf(daysToMonthBegin Mod 14 > 0, 1, 0)

    ' Step 3 - The date of the first date of this series inside that month is seriesDefinition + the number of fortnights from Step 2
    Dim firstDateOfSeriesInMonth As Date
    firstDateOfSeriesInMonth = DateAdd("d", (14 * numberFortnightsToFirstOccurenceOfSeriesInMonth), seriesDefinition)

    ' Step 4 - How many fortnights fit between the date from Step 3 and the last date of the [month]?
    NumberFortnightlyEventsInMonth = 1 + (DateDiff("d", firstDateOfSeriesInMonth, lastDateOfMonth) \ 14)

End Function
0 голосов
/ 29 октября 2010

При обработке дат не существует «умного» алгоритма, есть только утомительный. То есть вы должны конкретно указать, сколько дней в каждом месяце, обрабатывать високосные годы (каждые четыре года, кроме каждых 100 лет, кроме каждых 400 лет) и т. Д.

...