خوارزمية لحساب الأرقام التي تحدث كل أسبوعين في شهر تقويم معين

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

  •  27-09-2019
  •  | 
  •  

سؤال

أنا أبحث عن خوارزمية ذكية لتحديد عدد الأحداث التي تحدث كل أسبوعين في شهر تقويمي معين ، ضمن سلسلة محددة.

IE بالنظر إلى هذه السلسلة "كل يوم خميس 2 من 7 أكتوبر 2010" ، "الأحداث" تنخفض (7 أكتوبر 2010 ، 21 أكتوبر ، 4 نوفمبر ، 18 نوفمبر ، 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

بحيث يكون بدقة: numberforteventsinesisteriesthatfallencalendarmonth

أمثلة:

NumberForteventsIneventsInth ('7 أكتوبر 2010 ، "أكتوبر 2010") -> 2

NumberForteventsIneventsInth ('7 أكتوبر 2010 ،' نوفمبر 2010 ') -> 2

NumberForteventsIneventsInmonth ('7 أكتوبر 2010 ،' ديسمبر 2010 ') -> 3

لاحظ أن شهر أكتوبر لديه حدثان ، في شهر نوفمبر حدثان ، ولكن لدى ديسمبر 3 أحداث.


PSUEDOCODE المفضل.

لا أرغب في الاعتماد على جداول البحث أو مكالمات خدمة الويب أو أي موارد خارجية أخرى بخلاف يحتمل المكتبات العالمية. على سبيل المثال ، أعتقد أنه يمكننا أن نفترض بأمان أن معظم لغات البرمجة سيكون لها بعض وظائف معالجة التاريخ المتاحة.

هل كانت مفيدة؟

المحلول 3

بلدي الحل ...

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

نصائح أخرى

لا توجد خوارزمية "ذكية" عند التعامل مع التواريخ ، لا يوجد سوى خطوة مملة. أي أنه عليك أن تدرج على وجه التحديد عدد الأيام التي تقع في كل شهر ، والتعامل مع سنوات القفز (كل أربع سنوات ، باستثناء كل 100 عام ، باستثناء كل 400 عام) ، إلخ.

حسنًا ، بالنسبة للخوارزمية التي تتحدث عنها عن الحل المعتاد هو حساب رقم اليوم الذي يبدأ من تاريخ ثابت. (عدد اليوم بالإضافة إلى عدد الأيام المتراكمة في الأشهر السابقة بالإضافة إلى عدد السنوات * 365 ناقص (عدد السنة / 4) بالإضافة إلى (عدد السنة / 100) ناقص (عدد السنة / 400)))

بعد ذلك ، يمكنك تنفيذ ما تحتاجه بسهولة. تحتاج إلى حساب أي يوم من الأسبوع هو 1 يناير. ثم يمكنك بسهولة رؤية عدد "كل يوم خميس" من ذلك اليوم إلى 1 أكتوبر 2010 و 1 ديسمبر 2010. اختلافها هو القيمة التي تبحث عنها .

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top