Интересный вопрос, потому что это не так просто, как кажется. Ответ на corect, с точки зрения эффективности кода, зависит от используемого вами кодового языка. Но, в общем, рассмотрим это;
Sub Days_of_30()
' declare some Variables
Dim YBeg, YEnd, Y 'Years: Start, End, Loop Yr Val
Dim M1, M2 'Months
Dim iDif 'Day Dif
Dim nxtYR 'Required coz no GoTo
//parameters here
YBeg = 2016 'Set Start Year
YEnd = 2019 'Set End Year
//General Code
For Y = YBeg To YEnd
nxtYR = Y + 0
For M1 = 1 To 12 'Loop each Month
M2 = M1 + 1
Select Case M1
Case 12
nxtYR = Y + 1
M2 = 1
End Select
iDif = DateDiff("d", CDate(M1 & "/" & 1 & "/" & Y), _
CDate(M2 & "/" & 1 & "/" & nxtYR))
//*** Output here
If iDif = 30 Then Debug.Print CDate(M1 & "/" & 1 & "/" & Y)
Next
Next
End Sub
Это должно вывести все 30-дневные месяцы в диапазоне параметров. Очевидно, что код может быть намного эффективнее (быстрее) с помощью операторов GoTo, но некоторые люди не знают, как их использовать эффективно, поэтому большинство «современных» языков не используют GoTo (позор, вздох).
Предполагая, что вы используете скриптовый язык, который неявно объявляет типы var, приведенное выше должно работать, но в идеале, если ваш выбор языка поддерживает объявления типа var, вы должны их использовать.
Надеюсь, вы сочтете это полезным.
Gary