Интересный вопрос, ведь он не так прост, как кажется. Правильный ответ с точки зрения эффективности кода зависит от используемого вами языка кода. Но, вообще говоря, подумайте об этом;
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, вы должны их использовать.
Надеюсь, вы найдете это полезным.
Гэри
30.01.2016