Что нового

[Время, дата] Определить попадает ли временной период в другой временной период

XpycT

Скриптер
Сообщения
380
Репутация
133
Всем привет.

Есть временной период (дата и время может меняться)
Код:
Dim $aPeriod[2] = ["28.03.2012 22:00", "30.03.2012 08:00"]


Подскажите как определить сколько раз в заданный временной период попадает этот временной промежуток 22:00 - 08:00.
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
C2H5OH
OffTopic:
нет это не конкурс, это вопрос.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
при подсчете по пальцам получается два раза...может стоит исходить из разности первых двух чисел: 30-28=2
то есть от последнего числа отнять первое..разница есть количество..функции работы со строками...
или я не в том болоте рыбу ловлю? :smile:
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
Александр
Код:
Dim $aPeriod[2] = ["28.03.2012 23:00", "30.03.2012 07:00"]


При таком раскладе, это не пройдет
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Ты уверен что для периода
Код:
Dim $aPeriod[2] = ["28.03.2012 23:00", "30.03.2012 07:00"]

правильный ответ один раз?
В моём понимании это два раза:
28.03.2012 23:00 - 29.03.2012 08:00
29.03.2012 22:00 - 30.03.2012 07:00

В моём понимании
Код:
Dim $aPeriod[2] = ["28.03.2012 07:00", "28.03.2012 23:00"]

это тоже два раза.
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
C2H5OH [?]
Уверен

Потому что проверка должна быть вот по этим периодам
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 сюда не попадает, так как меньше)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
То есть для периода
Код:
Dim $aPeriod[2] = ["28.03.2012 23:00", "30.03.2012 07:00"]

правильный ответ всё таки ни разу ?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
XpycT
Так вы тогда не вводите людей в заблуждение ;) У нас читают и считают с лева на право!
в вашем примере интервал
Потому что проверка должна быть вот по этим периодам
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 сюда не попадает, так как меньше)
Нужно обозначать с 08:00 и до 22:00, а не наоборот, как вы нам написали. ;)
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Код:
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 & " раз")


С годами лень возиться. Если даты могут быть разного года, то дописывайте учет високосных годов.
Хотя и в одном году может 29-ое февраля попасть...
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
Garrett [?]
как вы нам написали
Написал я правильно, мне нужно проверять именно период с 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)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
XpycT по логике вещей Александр прав. Период с 22 или 23 и до 08 или 07 (в течение 2х дней с 28 до 30) встречается 2 раза.

>>> Step I
28 с 22:00
29 до 08:00

>>> Step II
29 с 22:00
30 до 08


Всё, далее уже пойдёт 31`е
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
C2H5OH [?]
А что спросить то хотел?
Скрипт написал, уже после того как создал тему.

Может кто подскажет способ как это сделать по другому?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
XpycT [?]
Может кто подскажет способ как это сделать по другому?
У меня получилось? (Считает сколько раз попал временной период между заданными датами)математика это все-таки моё
Код:
#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
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
Redline
Да получилось :laugh:.

Как я понял в качестве абстрактной даты, можно указать любую дату?
 
Верх