Что нового

как проверить попадает ли текущий час в промежуток времени ?

mitiya

Новичок
Сообщения
75
Репутация
0
уже голову сломал если честно ((

мне нужно что бы скрипт выполнял определенные действия в промежутке к примеру 19-4 часа.
тут получается старт больше финиша
а если промежуток 14-19 то тут старт меньше финиша. и как такое условие проверить нормально ?
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Код:
#cs
Пример switch
#ce
Switch @HOUR
	Case 19 To 24,1 To 4
		MsgBox(0,'Пример Switch',"Сейчас время в промежутке от 19 часов до 4!")
EndSwitch



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

Заметил странную штуку
Код:
Select
	Case $c >= 19 And $c <= 24 Or $c >= 1 And $c <= 4
		MsgBox(0,'','')
EndSelect

По моим предположениям должна произойти проверка на промежутки:
$c € [19;24]U[1;4] но почему то не происходит вызов MsgBox, хотя время 19:52


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

Может я ошибся в условиях и перепутал установку операторов and и or?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mitiya,
Код:
Switch Int(@HOUR)
	Case 0 To 3, 19 To 23
		MsgBox(0, 'Пример Switch', "Сейчас время в промежутке от 19:00 часов до 4:00!")
EndSwitch
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
это все удобно, если руками в скрипте это прописать .

но вот если я беру время начала и конца из ini , как мне предусмотреть другие варианты ?
например в примере

Код:
Case 0 To 3, 19 To 23


19 - это начало
3 - это конец

если я к примеру пропишу в ini файле уже например 2 - начало, а 17 - конец , получится следующие

Код:
Case 0 To 17, 2 To 23


в результате скрипт будет срабатывать вообще всегда

:stars:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
mitiya [?]
но вот если я беру время начала и конца из ini
Код:
$iStart = Int('19')
$iEnd = Int('4') - 1

Switch $iStart
	Case 0 To 23
	Case Else
		MsgBox(16, 'Error', 'Ошибка промежутка времени')
		Exit
EndSwitch
Switch $iEnd
	Case 0 To 23
	Case Else
		MsgBox(16, 'Error', 'Ошибка промежутка времени')
		Exit
EndSwitch
If $iStart > $iEnd Then
	Switch Int(@HOUR)
		Case 0 To $iEnd, $iStart To 23
			MsgBox(64, '1-Info', 'Сейчас время в промежутке от ' & $iStart & ':00 часов до ' & $iEnd + 1 & ':00')
	EndSwitch
ElseIf $iStart < $iEnd Then
	Switch Int(@HOUR)
		Case $iStart To $iEnd
			MsgBox(64, '2-Info', 'Сейчас время в промежутке от ' & $iStart & ':00 часов до ' & $iEnd + 1 & ':00')
	EndSwitch
Else
	MsgBox(16, 'Error', 'Ошибка промежутка времени')
	Exit
EndIf
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
MnM [?]
почему то не происходит
Операторы AND и OR имеют одинаковый приоритет. Поэтому нужны скобки
Код:
Case ($c >= 19 And $c <= 24) Or ($c >= 1 And $c <= 4)
И, кстати, диапазон @HOUR от 00 до 23, а не от 01 до 24.
 
Автор
M

mitiya

Новичок
Сообщения
75
Репутация
0
написал функцию для проверки, может кому пригодится

Код:
#cs ----------------------------------------------------------------------------
 CheckTimeInterval.au3

 AutoIt Version: 3.3.8.1
 Author:         mitiya

 Script Function:
	Проверка попадает ли время в определенный интервал времени.
	
	Возвращаемое значение
	Успех:	Возвращает 1.
	Ошибка:	Возвращает 0, если время не попадает в интервал.
	Ошибка:	Возвращает -1, если формат времени неправильный.
	
	правильный формат:
		1:15:23.26 ; 11:30 ; 6
	
	не правильный:
		01:15:23.26 ; 2:03 ; 06
		
#ce ----------------------------------------------------------------------------

#include-once

Func _CheckInterval($start,$end,$now)

	if not _CheckInterval_TimeFormat($start) then return -1
	if not _CheckInterval_TimeFormat($end)   then return -1
	if not _CheckInterval_TimeFormat($now)   then return -1
	
	
	
	local $iStart = StringSplit($start,':')
	Switch $iStart[0]
		Case 1
			$iStart = $iStart[1]
		Case 2
			$iStart = $iStart[1] & $iStart[2]
		Case 3
			$iStart = $iStart[1] & $iStart[2] & $iStart[3]
		Case Else
			return -1
	EndSwitch
	
	local $iEnd = StringSplit($end,':')
	Switch $iEnd[0]
		Case 1
			$iEnd = $iEnd[1]
		Case 2
			$iEnd = $iEnd[1] & $iEnd[2]
		Case 3
			$iEnd = $iEnd[1] & $iEnd[2] & $iEnd[3]
		Case Else
			return -1
	EndSwitch
	
	local $iNow = StringSplit($now,':')
	Switch $iNow[0]
		Case 1
			$iNow = $iNow[1]
		Case 2
			$iNow = $iNow[1] & $iNow[2]
		Case 3
			$iNow = $iNow[1] & $iNow[2] & $iNow[3]
		Case Else
			return -1
	EndSwitch
	
	If $iStart > $iEnd Then
		Switch $iNow
			Case 0 To $iEnd, $iStart To 235959.99
				return 1
			Case else
				return 0
		EndSwitch
	ElseIf $iStart < $iEnd Then
		Switch $iNow
			Case $iStart To $iEnd
				return 1
			Case else
				return 0
		EndSwitch
	Else
		if ($iStart = $iEnd) and ($iStart = $iNow) then return 1
	
		return 0
	EndIf
	
EndFunc

Func _CheckInterval_TimeFormat($t)

	local $time = StringSplit($t,':')
	
	if not (Int($time[1])==$time[1]) then return 0
	Switch $time[1]
		Case 0 To 23
		Case Else
			return 0
	EndSwitch	
	
	if $time[0] > 1 then
	if not (Int($time[2])==$time[2]) then return 0
		Switch $time[2]
			Case 0 To 59
			Case Else
				return 0
		EndSwitch
	endif	
	
	if $time[0] > 2 then 
		Switch $time[3]
			Case 0 To 59.99
			Case Else
				return 0
		EndSwitch
	endif
	
	return 1
EndFunc
 
Верх