Что нового

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

XpycT

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

Есть 5-ть временных периодов
Код:
Dim $aTimePeriod[6] = [5, "06:00 - 07:59", "08:00 - 12:59", "13:00 - 17:59", "18:00 - 21:59", "22:00 - 05:59"]


Есть заданное время (например 15:06), это время всегда разное.

Подскажите как определить в какой из заданных временных периодов попадает заданное время.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
http://forum.oszone.net/post-1448405.html#post1448405

P.S
И посмотри на «Похожие темы» внизу ;)


Добавлено:
Сообщение автоматически объединено:

Это конечно больше направление чем решение задачи. Диапазон значений думаю не сложно вычислить (простой проверкой - больше первого и меньше второго значения в диапазоне, ну или наоборот).
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вижу решение только с двумерным массивом ;)

Код:
#include <date.au3>

Dim $aTimePeriod[6] = [5, "06:00 - 07:59", "08:00 - 12:59", "13:00 - 17:59", "18:00 - 21:59", "22:00 - 05:59"]
Dim $aTP[6][2] = [['06:00','07:59'],['08:00','12:59'],['13:00','17:59'],['18:00','21:59'],['22:00','05:59']]
Dim $a2DTP[6][2] = [ _
[_TimeToTicks(StringLeft($aTP[0][0], 2), StringRight($aTP[0][0], 2))  ,_TimeToTicks(StringLeft($aTP[0][1], 2), StringRight($aTP[0][1], 2))], _
[_TimeToTicks(StringLeft($aTP[1][0], 2), StringRight($aTP[1][0], 2))  ,_TimeToTicks(StringLeft($aTP[1][1], 2), StringRight($aTP[1][1], 2))], _
[_TimeToTicks(StringLeft($aTP[2][0], 2), StringRight($aTP[2][0], 2))  ,_TimeToTicks(StringLeft($aTP[2][1], 2), StringRight($aTP[2][1], 2))], _
[_TimeToTicks(StringLeft($aTP[3][0], 2), StringRight($aTP[3][0], 2))  ,_TimeToTicks(StringLeft($aTP[3][1], 2), StringRight($aTP[3][1], 2))], _
[_TimeToTicks(StringLeft($aTP[4][0], 2), StringRight($aTP[4][0], 2))  ,_TimeToTicks(StringLeft($aTP[4][1], 2), StringRight($aTP[4][1], 2))]]

$sTime = '15:06'

$iTicks = _TimeToTicks(StringLeft($sTime, 2), StringRight($sTime, 2))

If $iTicks > $a2DTP[0][0] And $iTicks < $a2DTP[0][1] Then
	ConsoleWrite('Временная метка ' & $sTime & ' попадает в период между ' & $aTP[0][0] & ' и ' & $aTP[0][1] & @CRLF)
ElseIf $iTicks > $a2DTP[1][0] And $iTicks < $a2DTP[1][1] Then
	ConsoleWrite('Временная метка ' & $sTime & ' попадает в период между ' & $aTP[1][0] & ' и ' & $aTP[1][1] & @CRLF)
ElseIf $iTicks > $a2DTP[2][0] And $iTicks < $a2DTP[2][1] Then
	ConsoleWrite('Временная метка ' & $sTime & ' попадает в период между ' & $aTP[2][0] & ' и ' & $aTP[2][1] & @CRLF)
ElseIf $iTicks > $a2DTP[3][0] And $iTicks < $a2DTP[3][1] Then
	ConsoleWrite('Временная метка ' & $sTime & ' попадает в период между ' & $aTP[3][0] & ' и ' & $aTP[3][1] & @CRLF)
ElseIf $iTicks > $a2DTP[4][0] Or $iTicks < $a2DTP[4][1] Then
	ConsoleWrite('Временная метка ' & $sTime & ' попадает в период между ' & $aTP[4][0] & ' и ' & $aTP[4][1] & @CRLF)
EndIf
 

SyDr

Сидра
Сообщения
651
Репутация
158
Код:
Dim $aTimePeriod[5] = ["06:00 - 07:59", "08:00 - 12:59", "13:00 - 17:59", "18:00 - 21:59", "22:00 - 05:59"]
Dim $sTime = "06:59"

Dim $result = Get($aTimePeriod, $sTime)
MsgBox(4096, '', 'Время ' & $sTime & ' попадает в временной промежуток №' & $result + 1 & ' (' & $aTimePeriod[$result] & ')')

Func Get($aTimes, $sTime)
	Local $nStart, $nEnd
	Local $nTime = Int(StringLeft($sTime, 2)) * 60 + Int(StringRight($sTime, 2))

	For $nCount = 0 To UBound($aTimes, 1) - 1
		$nStart = Int(StringMid($aTimes[$nCount], 1, 2)) * 60 + Int(StringMid($aTimes[$nCount], 4, 2))
		$nEnd = Int(StringMid($aTimes[$nCount], 9, 2)) * 60 + Int(StringMid($aTimes[$nCount], 12, 2))
		If $nTime >= $nStart And $nTime <= $nEnd Then Return $nCount
		If $nStart > $nEnd And $nTime <= $nStart Then Return $nCount
	Next
	Return SetError(1, 0 , -1)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
У меня так работает, только надо последний период "22:00 - 05:59" разбить на 2 "22:00 - 23:59", "00:00 - 05:59":
Код:
Dim $aTimePeriod[7] = _
		[6, '06:00 - 07:59', '08:00 - 12:59', '13:00 - 17:59', '18:00 - 21:59', '22:00 - 23:59', _
		'00:00 - 05:59']
$sTime = '15:06'
$sTimeCheck = Number(StringLeft($sTime, StringInStr($sTime, ':') - 1))
For $i = 1 To $aTimePeriod[0]
	If $sTimeCheck >= Number(StringLeft($aTimePeriod[$i], 2)) And _
			$sTimeCheck <= Number(StringMid($aTimePeriod[$i], 9, 2)) Then ExitLoop
Next
MsgBox(0, '№ периода:' & $i, 'Значение: ' & $aTimePeriod[$i])
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
Пишем время без разделителя, например вместо 06:00 пишем 0600 и получаем числа которые можно прекрасно сравнивать.

Код:
Dim $aTimePeriod[6] = [5, "06:00 - 07:59", "08:00 - 12:59", "13:00 - 17:59", "18:00 - 21:59", "22:00 - 05:59"]

$iTime = @HOUR & @MIN

For $i = 1 To $aTimePeriod[0] Step +1
	$aSplittedPeriod = StringSplit(StringReplace($aTimePeriod[$i], ':', ''), ' - ', 1)
	If $aSplittedPeriod[1] <= $aSplittedPeriod[2] Then
		If $iTime >= $aSplittedPeriod[1] And $iTime <= $aSplittedPeriod[2] Then ExitLoop
	Else
		If ($iTime >= $aSplittedPeriod[1] And $iTime <= 2359) Or ($iTime <= $aSplittedPeriod[2] And $iTime >= 0) Then ExitLoop
	EndIf
Next
If $i < $aTimePeriod[0]+1 Then MsgBox(0, '', $aTimePeriod[$i]) ;Else MsgBox(0,'','не найдено')


Зы
22:00 - 05:59 теперь работает.
 
Автор
X

XpycT

Скриптер
Сообщения
380
Репутация
133
dwerf
Спасибо за решение
 
Верх