Algoritmo per calcolare il numero quindicinale che si verificano eventi in un dato mese di calendario
Domanda
Sto cercando l'algoritmo intelligente per la determinazione del numero di eventi che si verificano ogni quindici giorni in un dato mese di calendario, all'interno di una specifica serie.
vale a dire. Data la serie è 'Ogni Giovedi 2 dal 7 ottobre 2010' gli "eventi" sono in calo su (7 ottobre 2010, 21 ottobre, 4 Nov 18 Nov, 2 dicembre, 16 dicembre, 30 dicembre, ...)
Quindi quello che sono dopo è una funzione
function(seriesDefinition, month) -> integer
where:
- seriesDefinition is some date that is a valid date in the series,
- month indicates a month and a year
in modo tale che yeilds con precisione: numberFortnightlyEventsInSeriesThatFallInCalendarMonth
Esempi:
NumberFortnightlyEventsInMonth ( '7 ottobre 2010, 'ottobre 2010') -> 2
NumberFortnightlyEventsInMonth ( '7 ottobre 2010, 'Nov2010') -> 2
NumberFortnightlyEventsInMonth ( '7 ottobre 2010, 'Dicembre 2010') -> 3
Si noti che ottobre ha 2 eventi, Novembre ha 2 eventi, ma dicembre ha 3 eventi.
psuedocodarlo preferito.
Non voglio fare affidamento su tabelle di ricerca o le chiamate di servizio web o qualsiasi altra risorsa esterni diversi librerie universali. Per esempio, credo che possiamo tranquillamente assumere che la maggior parte dei linguaggi di programmazione avrà alcune funzioni di manipolazione data disponibile.
Soluzione 3
La mia soluzione ...
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
Altri suggerimenti
Non v'è alcun algoritmo "intelligente" quando date movimentazione, c'è solo quello noioso. Cioè, si deve in particolare lista quanti giorni sono in ogni mese, anni bisestili maniglia (ogni quattro anni, tranne che ogni 100 anni, salvo ogni 400 anni), ecc.
Bene, per l'algoritmo si sta parlando la soluzione più comune è quello di calcolare il numero del giorno a partire da una certa data fissata. (Numero di giorno più numero cumulato di giorni in mesi prev con numero di anni * 365 meno (numero di anni / 4) più (numero di anni / 100) meno (numero di anni / 400))
Avendo questo, si può facilmente implementare ciò che è necessario. È necessario calcolare in quale giorno della settimana è stato il 1 gennaio 1. Quindi si può facilmente vedere qual è il numero di "ogni secondo giovedì" Da quel giorno al 1 ottobre 2010 e il 1 dicembre 2010. la loro differenza è il valore che si sta cercando .