а разве количество временных промежутков изменилось? так же дваПри таком раскладе, это не пройдет
Но заданный временной период 22:00 - 08:00, попадет только один раза разве количество временных промежутков изменилось?
Dim $aPeriod[2] = ["28.03.2012 23:00", "30.03.2012 07:00"]
Dim $aPeriod[2] = ["28.03.2012 07:00", "28.03.2012 23:00"]
УверенТы уверен
Нужно обозначать с 08:00 и до 22:00, а не наоборот, как вы нам написали. ;)Потому что проверка должна быть вот по этим периодам
28.03.2012 22:00 - 29.03.2012 08:00 (28.03.2012 23:00 сюда не попадает, так как больше)
29.03.2012 22:00 - 30.03.2012 08:00 (30.03.2012 07:00 сюда не попадает, так как меньше)
Dim $aPeriod[2] = ["28.03.2012 23:00", "29.04.2012 07:00"]
Dim $monthes[13] = [0,31,28,31,30,31,30,31,31,30,31,30,31]
$array1 = StringSplit($aPeriod[0], '. :', 0)
$array2 = StringSplit($aPeriod[1], '. :', 0)
$N=-1
If $array1[4] < 22 Then $N += 1
If ($array1[4] = 22) AND (int($array1[5]) = 0) Then $N += 1
If $array2[4] >= 8 Then $N += 1
$N = $N + $array2[1] - $array1[1] - 1
For $i = $array1[2] To $array2[2]-1
$N += $monthes[$i]
Next
If $N < 0 Then $N = 0
MsgBox(0, "", "попадает " & $N & " раз")
Написал я правильно, мне нужно проверять именно период с 22:00 до 08:00как вы нам написали
#include <Array.au3>
#include <Date.au3>
Dim $aPrd[1][2] = [["2012/03/28 23:00", "2012/03/30 07:00"]], $aCheckPrd[4]
$iDaysDiff = _DateDiff("D", StringLeft($aPrd[0][0], 10), StringLeft($aPrd[0][1], 10))
; ConsoleWrite("$iDaysDiff = " & $iDaysDiff & @CR)
Dim $aDatePrd[$iDaysDiff + 1]
For $d = 0 To $iDaysDiff
$aDatePrd[$d] = _DateAdd("D", $d, StringLeft($aPrd[0][0], 10))
Next
; _ArrayDisplay($aDatePrd)
$aPrd[0][0] = StringRegExpReplace($aPrd[0][0], "([/|\ |:])", "")
$aPrd[0][1] = StringRegExpReplace($aPrd[0][1], "([/|\ |:])", "")
ConsoleWrite("$aPrd = " & $aPrd[0][0] & " - " & $aPrd[0][1] & @CR)
Dim $iCount = 0
For $d = 0 To UBound($aDatePrd, 1) - 1
$aCheckPrd[0] = $aDatePrd[$d] & " 22:00"
$aCheckPrd[1] = _DateAdd("d", 1, StringLeft($aDatePrd[$d], 10)) & " 00:00"
$aCheckPrd[2] = _DateAdd("h", 6, $aCheckPrd[1])
$aCheckPrd[3] = _DateAdd("h", 2, $aCheckPrd[2])
ConsoleWrite("$aCheckPrd = " & $aCheckPrd[0] & " | " & $aCheckPrd[1] & " | " & $aCheckPrd[2] & " | " & $aCheckPrd[3] & @CR)
$aCheckPrd[0] = StringRegExpReplace($aCheckPrd[0], "([/|\ |:])", "")
$aCheckPrd[1] = StringRegExpReplace($aCheckPrd[1], "([/|\ |:])", "")
$aCheckPrd[2] = StringRegExpReplace($aCheckPrd[2], "([/|\ |:])", "")
$aCheckPrd[3] = StringRegExpReplace($aCheckPrd[3], "([/|\ |:])", "")
If $aPrd[0][0] <= $aCheckPrd[0] Or ($aPrd[0][0] >= $aCheckPrd[0] And $aPrd[0][0] <= $aCheckPrd[1]) Then
; ConsoleWrite($aPrd[0][0] & " <= " & $aCheckPrd[0] & " Or (" & $aPrd[0][0] & " >= " & $aCheckPrd[0] & " And " & $aPrd[0][0] & " <= " & $aCheckPrd[1] & ")" & @CR)
ConsoleWrite("$aPrd[0][0] <= $aCheckPrd[0] Or ($aPrd[0][0] >= $aCheckPrd[0] And $aPrd[0][0] <= $aCheckPrd[1])" & @CR)
If $aPrd[0][1] >= $aCheckPrd[3] Or ($aPrd[0][1] >= $aCheckPrd[2] And $aPrd[0][1] <= $aCheckPrd[3]) Then
ConsoleWrite($aPrd[0][1] & " >= " & $aCheckPrd[3] & " Or (" & $aPrd[0][1] & " >= " & $aCheckPrd[2] & " And " & $aPrd[0][1] & " <= " & $aCheckPrd[3] & ")" & @CR)
ConsoleWrite("$aPrd[0][1] >= $aCheckPrd[3] Or ($aPrd[0][1] >= $aCheckPrd[2] And $aPrd[0][1] <= $aCheckPrd[3])" & @CR)
$iCount += 1
EndIf
EndIf
Next
ConsoleWrite("$iCount = " & $iCount & @CR)
Вот скрипт который у меня получился
Скрипт написал, уже после того как создал тему.А что спросить то хотел?
У меня получилось? (Считает сколько раз попал временной период между заданными датами)математика это все-таки моёМожет кто подскажет способ как это сделать по другому?
#include <Array.au3>
#include <Date.au3>
Dim $aPeriod[2] = ['28.03.2012 23:00', '30.03.2012 07:00']
$sTimeStart = '22:00' ; время начала интересующего периода
$sTimeFinish = '08:00'; время окончания интересующего периода
$sD = '2000/10/10 ' ; абстрактная дата
$aPeriodDateStart = StringSplit(StringLeft($aPeriod[0], 10), '.', 2) ; массив даты начала
$aPeriodDateFinish = StringSplit(StringLeft($aPeriod[1], 10), '.', 2) ; массив даты окончания
$sPeriodDateStart = $aPeriodDateStart[2] & '/' & $aPeriodDateStart[1] & '/' & $aPeriodDateStart[0] ; строка даты начала
$sPeriodDateFinish = $aPeriodDateFinish[2] & '/' & $aPeriodDateFinish[1] & '/' & $aPeriodDateFinish[0] ; строка даты окончания
$sPeriodTimeStart = StringRight($aPeriod[0], 5) ; время начала
$sPeriodTimeFinish = StringRight($aPeriod[1], 5) ; время окончания
If _DateDiff('n', $sD & $sPeriodTimeStart, $sD & $sTimeStart) < 0 Then ; начало периода не может попасть в первые сутки
$sDateStart = _DateAdd('D', 1, $sPeriodDateStart & ' ' & $sTimeStart) ; дата начала отсчета периодов
Else
$sDateStart = $sPeriodDateStart & ' ' & $sTimeStart ; дата начала отсчета периодов
EndIf
ConsoleWrite($sDateStart & @CRLF)
If _DateDiff('n', $sD & $sPeriodTimeFinish, $sD & $sTimeFinish) > 0 Then ; конец периода не может попасть в последние сутки
$sDateFinish = _DateAdd('D', -1, $sPeriodDateFinish & ' ' & $sTimeFinish) ; дата окончания отсчета периодов
Else
$sDateFinish = $sPeriodDateFinish & ' ' & $sTimeFinish ; дата окончания отсчета периодов
EndIf
ConsoleWrite($sDateFinish & @CRLF)
$iDays = _DateDiff('D', $sDateStart, $sDateFinish) + 1
If $iDays >= 0 Then
ConsoleWrite($iDays & @CRLF)
Else
ConsoleWrite(0 & @CRLF)
EndIf