Algoritmo para calcular el número que ocurre cada dos semanas los acontecimientos en un mes natural dado

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

  •  27-09-2019
  •  | 
  •  

Pregunta

Estoy buscando el algoritmo inteligente para determinar el número de eventos que ocurren cada dos semanas en un mes calendario dado, dentro de una serie específica.

es decir. Teniendo en cuenta la serie es 'Cada segundo Jueves del 7 de octubre 2010' los "eventos" están cayendo en (7 Oct 2010 21 Oct 4 Nov 18 Nov 2 Dic 16 Dic 30 Dic, ...)

Así que lo que busco es una función

function(seriesDefinition, month) -> integer 

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

tal que yeilds precisión: numberFortnightlyEventsInSeriesThatFallInCalendarMonth

Ejemplos:

NumberFortnightlyEventsInMonth ( '7 oct 2010, 'PTU 2010') -> 2

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

NumberFortnightlyEventsInMonth ( '7 oct 2010, 'Dic 2010') -> 3

Nota aquel octubre tiene 2 eventos, Noviembre tiene 2 eventos, pero diciembre es 3 eventos.


psuedocode prefiere.

No quiero depender de tablas de búsqueda o las llamadas de servicio web u otros recursos externos que no sean potencialmente bibliotecas universales. Por ejemplo, creo que podemos asumir con seguridad que la mayoría de los lenguajes de programación tendrán algunas funciones de manipulación de fecha disponible.

¿Fue útil?

Solución 3

Mi solución ...

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

Otros consejos

No existe un algoritmo "inteligente" cuando las fechas de manipulación, sólo hay un tedioso. Es decir, usted tiene que específicamente lista de cuántos días hay en cada mes, año bisiesto mango (cada cuatro años, excepto cada 100 años, excepto cada 400 años), etc.

Bueno, para el algoritmo se habla de la solución habitual es calcular el número de días a partir de una fecha fija. (Número de días más el número acumulado de días en los meses más prev número de años * 365 menos (número de años / 4) más (número de años / 100) menos (número de años / 400))

Tener esto, se puede implementar fácilmente lo que necesita. Es necesario calcular qué día de la semana fue 1 el 1 de enero A continuación, puede ver fácilmente lo que es el número de "cada segundo jueves de que" día a 1 Oct 2010 y 1 de diciembre de 2010. su diferencia es el valor que busca .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top