Algoritmo per calcolare il numero quindicinale che si verificano eventi in un dato mese di calendario

StackOverflow https://stackoverflow.com/questions/4046698

  •  27-09-2019
  •  | 
  •  

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.

È stato utile?

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 .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top