2

我正在寻找最聪明的算法来确定特定系列中给定日历月中每两周发生的事件的数量。

即鉴于该系列是“从 2010 年 10 月 7 日起的每个第二个星期四”,“事件”正在发生(2010 年 10 月 7 日、10 月 21 日、11 月 4 日、11 月 18 日、12 月 2 日、12 月 16 日、12 月 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('2010 年 10 月 7 日,'2010 年 10 月') -> 2

NumberFortnightlyEventsInMonth('7 Oct 2010, 'Nov2010') -> 2

NumberFortnightlyEventsInMonth('2010 年 10 月 7 日,'2010 年 12 月')-> 3

请注意,10 月有 2 个事件,11 月有 2 个事件,但 12 月有 3 个事件。


首选伪代码。

除了潜在的通用库之外,我不想依赖查找表或 Web 服务调用或任何其他外部资源。例如,我认为我们可以有把握地假设大多数编程语言都有一些可用的日期操作函数。

4

3 回答 3

0

我的解决方案...

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
于 2010-11-07T19:40:24.990 回答
0

好吧,对于您正在谈论的算法,通常的解决方案是从某个固定日期开始计算天数。(天数加上前几个月的累计天数加上年数 * 365 减去(年数 / 4)加上(年数 / 100)减去(年数 / 400))

有了这个,您可以轻松实现所需的功能。您需要计算一周中的哪一天是 1 月 1 日。然后您可以轻松查看从那天到 2010 年 10 月 1 日和 2010 年 12 月 1 日的“每第二个星期四”的数量。它们的区别是您正在寻找的值.

于 2010-10-28T20:26:57.167 回答
0

处理日期时没有“聪明”的算法,只有繁琐的算法。也就是说,您必须具体列出每个月有多少天,处理闰年(每四年,每 100 年除外,每 400 年除外)等。

于 2010-10-28T20:07:47.533 回答