Что нового

Как сверить системную дату и время с данными ( временными интервалами ) из файла

StarEdik

Новичок
Сообщения
365
Репутация
4
Версия AutoIt: 3.3.6.1

Описание:
Привет всем. :smile:
Имеется файл «Condition.txt» с временными интервалами.
Допустим такие интервалы.
26.11.2011 18:11 - 26.11.2011 18:27
27.11.2011 01:20 - 27.11.2011 01:45
28.11.2011 03:35 - 28.11.2011 03:45
28.11.2011 15:55 - 28.11.2011 16:20
30.11.2011 08:10 - 30.11.2011 08:25
05.01.2012 10:25 - 05.12.2012 10:30
21.01.2012 12:45 - 21.12.2012 13:00
Надо написать функцию для сверки условия. Скрипт ежеминутно должен построчно сверить системную дату и время с данными ( временными интервалами ) из файла :
-Если системное дата и время входит в заданные интервалы даты и времени ,то
На трее значок красного цвета.
-Если нет
то зеленого цвета
К примеру
на компьютере системное дата и время 27.11.2011 01:20 - цвет иконки в трее красный
на компьютере системное дата и время 27.11.2011 01:46 - цвет иконки в трее зеленый
Примечания:
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

Эти посты похожие, но не то
http://forum.oszone.net/post-1448405.html#post1448405
http://autoit-script.ru/index.php/topic,7334.msg50396.html#msg50396
http://autoit-script.ru/index.php/topic,2600.msg18784.html#msg18784
http://autoit-script.ru/index.php/topic,1800.msg12768.html#msg12768
http://autoit-script.ru/index.php/topic,1061.msg7539.html#msg7539
http://autoit-script.ru/index.php/topic,5585.msg39909.html#msg39909
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Попробуйте так.
Код:
#NoTrayIcon
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html

Opt('TrayMenuMode', 1)
Opt('MustDeclareVars', 1)

Global $iIndex, $iIndexOld, $sIconFile = @SystemDir & '\user32.dll', $iStart, $iTimeOut = 60000, $nExit, _
		$aTextToolTip[2] = ['Вне периода', 'В периоде']

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$nExit = TrayCreateItem('Выход')
TraySetState()
$iIndexOld = _IsNowInTimePeriod()
If @error Then
	_WinAPI_MessageBeep(2)
	TraySetIcon($sIconFile, 103)
	TraySetToolTip('Ошибка')
	$iIndexOld = -1
Else
	TraySetIcon($sIconFile, 100 + $iIndexOld)
	TraySetToolTip($aTextToolTip[$iIndexOld])
EndIf
$iStart = TimerInit()
_WinAPI_EmptyWorkingSet()
While 1
	If TimerDiff($iStart) > $iTimeOut Then
		$iIndex = _IsNowInTimePeriod()
		If @error Then
			_WinAPI_MessageBeep(2)
			TraySetIcon($sIconFile, 103)
			TraySetToolTip('Ошибка')
			$iIndexOld = -1
		Else
			If $iIndexOld <> $iIndex Then
				$iIndexOld = $iIndex
				_WinAPI_MessageBeep(3)
				TraySetIcon($sIconFile, 100 + $iIndexOld)
				TraySetToolTip($aTextToolTip[$iIndexOld])
			EndIf
		EndIf
		$iStart = TimerInit()
	EndIf
	Switch TrayGetMsg()
		Case 0
			ContinueLoop
		Case $nExit
			Exit
	EndSwitch
WEnd

Func _IsNowInTimePeriod()
	Local $s_Text, $a_Temp, $a_TempString, $i_TimeStart, $i_TimeEnd, _
			$i_Now = Number(@YEAR & @MON & @MDAY & @HOUR & @MIN), _
			$s_File = @ScriptDir & '\Condition.txt'

	If Not FileExists($s_File) Then Return SetError(1)
	$s_Text = FileRead($s_File)
	$a_Temp = StringSplit(StringStripCR($s_Text), @LF)
	For $i = 1 To $a_Temp[0]
		$a_TempString = StringSplit($a_Temp[$i], '-')
		If $a_TempString[0] <> 2 Then ContinueLoop
		$i_TimeStart = StringRegExpReplace($a_TempString[1], '.*(\d{2})\.(\d{2})\.(\d{4})\s+(\d{2}):(\d{2}).*', '$3$2$1$4$5')
		If @extended <> 5 Then ContinueLoop
		If $i_Now >= Number($i_TimeStart) Then
			$i_TimeEnd = StringRegExpReplace($a_TempString[2], '.*(\d{2})\.(\d{2})\.(\d{4})\s+(\d{2}):(\d{2}).*', '$3$2$1$4$5')
			If @extended <> 5 Then ContinueLoop
			If $i_Now <= Number($i_TimeEnd) Then Return 1
		EndIf
	Next
	Return 0
EndFunc   ;==>_IsNowInTimePeriod
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

madmasles
Гениально:shok: :smile:
Ведь есть на свете умные люди. РЕСПЕКТ !!! Знать одно, а знать и помогать, не каждому дано.
СПАСИБО ОГРОМНОЕ. Ваш уровень знаний восхищает меня , и я вам за помощь очень БЛАГОДАРЕН.
И если, будете снисходительны, я бы продолжил эту тему, задав вам несколько вопросов.
Проверил, скрипт работает на ура. Хотелось бы уточнить. :-[
- Отсчет запуска проверки идет после запуска скрипта и это дает разницу (от 1-го до 2-х минут).Может быть я и ошибаюсь.Что посоветуете. :scratch:
- У меня с _WinAPI_MessageBeep –ом проблемы, не выдает он Beep-ы и все. Можно ли вместо Beep-ов воспроизвести wav ,mid и другие файлы .Ну например C:\WINDOWS\Media\tada.wav и C:\WINDOWS\Media\notify.wav . Как говорится «Используй то,что под рукой ,и не ищи себе другое»
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
- Отсчет запуска проверки
Проверка идет сразу после запуска скрипта, потом с интервалом $iTimeOut.
- У меня с _WinAPI_MessageBeep –ом проблемы
Вы можете проигрывать любые звуки (или ничего не проигрывать), как Вам нравится (то же самое с иконками в трее). Можно, например, вшить в ресурсы пару файлов *.wav и проигрывать их с помощью _WinAPI_PlaySound() из WinAPIEx.au3.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

Подскажите, пожалуйста, как заменить в файле старую дату на новую.
То есть в файл «Condition.txt» составлен на 1 день - на 27.11.2011
Нажимая на «F4» все записи 27.11.2011 надо заменить на текущий.И так далее каждый день
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
А не проще даты убрать и контролировать только время?

Код:
$s_File = @ScriptDir & '\Condition.txt'
$s_Text = FileRead($s_File)
$s_Text = StringRegExpReplace($s_Text, '(?s)\d{2}(\.\d{2}\.\d{4})', @MDAY & '$1')
$hFile = FileOpen($s_File, 2)
FileWrite($hFile, $s_Text)
FileClose($hFile)
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

madmasles
Проверка идет сразу после запуска скрипта, потом с интервалом $iTimeOut.
Понял. С запуском нет проблемы. Но после запуска ,каждая проверка начала и каждая проверка конца периода опаздывает на от 1-1,5 минуты ,а допустимо +/- 10 секунд. Может что ни будь сможете придумать. :scratch: :whistle:
А не проще даты убрать и контролировать только время?
Спасибо. Великолепно. :shok: То, что надо. Этот файл для тестирования. Настоящий файл содержит около 3000 строк на разные дни, на разное время и на разный час.
проигрывать их с помощью _WinAPI_PlaySound() из WinAPIEx.au3.
Сделал .ОК. :smile:
Как сделать, чтоб начало и конец проверки отличались разными звуковыми файлами. А то ошибки воспроизводиться разными файлами, а начало и конец проверки с одним звуковым файлом. :-[
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
Но после запуска ,каждая проверка начала и каждая проверка конца периода опаздывает на от 1-1,5 минуты ,а допустимо +/- 10 секунд.
Ничего не понял. Прикрепите Ваш файл с 3000 строк. У меня на старом и слабом ноутбуке 3500 строк обрабатываются около четверти секунды.
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

Я наверно не так объяснил :-[ Добавляем в код
Код:
TraySetToolTip($aTextToolTip[$iIndexOld])
; .........................
		ConsoleWrite(" Now " &_Now()& @CRLF)
; .........................
            EndIf

На рабочем столе открываем файл «Condition.txt» для обзора. .Засекаем время.20:07.(допустим)
На «Condition.txt» это время подходит для интервала 27.11.2011 20:05 - 27.11.2011 20:08
Значит ровно 20:08 должно звучит Тада.
Запускем Ваш скрипт. На трее отображается иконка с восклицательном знаком .Ждем .Звучит тада. Смотрим на консоль и засекаем время 20:09:13.,а должно было бы 20:08:00(опоздание проверки конца периода на1м13сек)
и.т.д.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Теперь понял, что нужно, попробую сделать. Только это совершенно другое тех. задание, ИМХО.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Протестируйте. Не проверял при смене числа. Папка Resources должна быть рядом со скриптом.
Код:
#NoTrayIcon
#region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=Resources\script.ico
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_Res_File_Add=Resources\start.wav, WAVE, START
#AutoIt3Wrapper_Res_File_Add=Resources\end.wav, WAVE, END
#AutoIt3Wrapper_Res_File_Add=Resources\endtoday.wav, WAVE, ENDTODAY
#AutoIt3Wrapper_Run_Obfuscator=y
#Obfuscator_Parameters=/striponly
#endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

#include <Date.au3>
#include <WinAPIEx.au3>;Yashied, http://autoit-script.ru/index.php/topic,47.0.html
#include <APIConstants.au3>

Opt('TrayMenuMode', 1)
Opt('MustDeclareVars', 1)

Global $aCalls, $iIndex, $iCountCalls, $sToDayOld = @MDAY, $sToDay, $fNew, $sNextDate, $iStart, $iTimeOut, _
		$aIcon[3][2] = [['В периоде', 101],['Вне периода', 104],['На сегодня все', 100]], _
		$sIconFile = @SystemDir & '\user32.dll', $nExit

If WinExists(@ScriptName & '{[/@$@\]}') Then Exit
AutoItWinSetTitle(@ScriptName & '{[/@$@\]}')

$nExit = TrayCreateItem('Выход')
TraySetState()
_GetCallsToday($aCalls, $iIndex, $iCountCalls)
If $iCountCalls Then
	$iTimeOut = $aCalls[$aCalls[0][$iIndex]][$iIndex] * 1000
	TraySetIcon($sIconFile, $aIcon[Number(Not $iIndex)][1])
	TraySetToolTip($aIcon[Number(Not $iIndex)][0])
Else
	$sNextDate = _DateAdd('d', 1, _NowCalcDate())
	$iTimeOut = _DateDiff('s', _NowCalc(), $sNextDate & ' 00:00:00') * 1000
	$fNew = True
	TraySetIcon($sIconFile, $aIcon[2][1])
	TraySetToolTip($aIcon[2][0])
EndIf
$iStart = TimerInit()
_WinAPI_EmptyWorkingSet()
ConsoleWrite($iTimeOut & @LF)
ConsoleWrite($iIndex & @LF)
ConsoleWrite($iCountCalls & @LF)
While 1
	If TimerDiff($iStart) >= $iTimeOut Then
		If $fNew Then
			_GetCallsToday($aCalls, $iIndex, $iCountCalls)
			If $iCountCalls Then
				$iTimeOut = $aCalls[$aCalls[0][$iIndex]][$iIndex] * 1000
				$fNew = False
				TraySetIcon($sIconFile, $aIcon[Number(Not $iIndex)][1])
				TraySetToolTip($aIcon[Number(Not $iIndex)][0])
			Else
				$sNextDate = _DateAdd('d', 1, _NowCalcDate())
				$iTimeOut = _DateDiff('s', _NowCalc(), $sNextDate & ' 00:00:00') * 1000
				$fNew = True
				TraySetIcon($sIconFile, $aIcon[2][1])
				TraySetToolTip($aIcon[2][0])
			EndIf
			$iStart = TimerInit()
			_WinAPI_EmptyWorkingSet()
		Else
			$iCountCalls -= 1
			If $iCountCalls Then
				ConsoleWrite($aIcon[$iIndex][0] & @LF)
				ConsoleWrite(@HOUR & ':' & @MIN & ':' & @SEC & @LF)
				_PlaySound($iIndex)
				TraySetIcon($sIconFile, $aIcon[$iIndex][1])
				TraySetToolTip($aIcon[$iIndex][0])
				$aCalls[0][$iIndex] += 1
				$iIndex = Number(Not $iIndex)
				$iTimeOut = $aCalls[$aCalls[0][$iIndex]][$iIndex] * 1000
			Else
				$sToDay = @MDAY
				If $sToDayOld <> $sToDay Then
					$sToDayOld = $sToDay
					_GetCallsToday($aCalls, $iIndex, $iCountCalls)
					If $iCountCalls Then
						$iTimeOut = $aCalls[$aCalls[0][$iIndex]][$iIndex] * 1000
						$fNew = False
						TraySetIcon($sIconFile, 104)
						TraySetToolTip('Wait...')
					Else
						$sNextDate = _DateAdd('d', 1, _NowCalcDate())
						$iTimeOut = _DateDiff('s', _NowCalc(), $sNextDate & ' 00:00:00') * 1000
						$fNew = True
						TraySetIcon($sIconFile, $aIcon[2][1])
						TraySetToolTip($aIcon[2][0])
					EndIf
					$iStart = TimerInit()
					_WinAPI_EmptyWorkingSet()
				Else
					$sNextDate = _DateAdd('d', 1, _NowCalcDate())
					$iTimeOut = _DateDiff('s', _NowCalc(), $sNextDate & ' 00:00:00') * 1000
					$fNew = True
					_PlaySound(2)
					TraySetIcon($sIconFile, $aIcon[2][1])
					TraySetToolTip($aIcon[2][0])
					ConsoleWrite($aIcon[2][0] & @LF)
					ConsoleWrite(@HOUR & ':' & @MIN & ':' & @SEC & @LF)
				EndIf
			EndIf
			ConsoleWrite($iTimeOut & @LF)
		EndIf
	EndIf
	Switch TrayGetMsg()
		Case 0
			ContinueLoop
		Case $nExit
			Exit
	EndSwitch
WEnd

Func _GetCallsToday(ByRef $a_Calls, ByRef $i_Index, ByRef $i_CountCalls)
	Local $s_File = @ScriptDir & '\Condition.txt', $s_Pattern = '(?m)^(.*\Q' & @MDAY & '.' & @MON & '.' & @YEAR & '\E.*)$', _
			$s_Text, $a_TempToDay, $i_Ubound, $a_TempString, $i_Count, $i_TempStart, $i_TempEnd

	$s_Text = _CheckFile($s_File)
	$a_Calls = 0
	$i_CountCalls = 0
	$i_Index = 1
	$a_TempToDay = StringRegExp($s_Text, $s_Pattern, 3)
	If @error Then Return
	$i_Ubound = UBound($a_TempToDay)
	Dim $a_Calls[$i_Ubound + 1][2]
	For $i = 0 To $i_Ubound - 1
		$a_TempString = StringSplit($a_TempToDay[$i], '-', 2)
		If UBound($a_TempString) <> 2 Then ContinueLoop
		For $j = 0 To 1
			$a_TempString[$j] = StringStripWS($a_TempString[$j], 7)
			$a_TempString[$j] = StringRegExpReplace($a_TempString[$j], '^(\d{2})\.(\d{2})\.(\d{4})(.*?)$', '$3/$2/$1$4:00')
			$a_TempString[$j] = _DateDiff('s', _NowCalc(), $a_TempString[$j])
		Next
		If $a_TempString[0] >= 0 Or $a_TempString[1] >= 0 Then
			$i_Count += 1
			If $a_TempString[0] >= 0 Then
				$a_Calls[$i_Count][0] = $a_TempString[0]
				$i_CountCalls += 1
				If Not $a_Calls[0][0] Then $a_Calls[0][0] = $i_Count
			EndIf
			If $a_TempString[1] >= 0 Then
				$a_Calls[$i_Count][1] = $a_TempString[1]
				$i_CountCalls += 1
				If Not $a_Calls[0][1] Then $a_Calls[0][1] = $i_Count
			EndIf
		EndIf
	Next
	If $i_Count Then
		ReDim $a_Calls[$i_Count + 1][2]
		If $a_Calls[0][0] Then
			If $a_Calls[0][0] <= $a_Calls[0][1] Then $i_Index = 0
		EndIf
	EndIf
EndFunc   ;==>_GetCallsToday

Func _CheckFile($s_File)
	Local $s_Text, $a_Temp, $a_TempString, $a_Array[1][2]

	If Not FileExists($s_File) Then
		TrayTip('Периоды', 'Отсутствует файл с временными периодами', 5, 3)
		Sleep(5000)
		Exit
	EndIf
	$s_Text = FileRead($s_File)
	If Not $s_Text Then
		TrayTip('Периоды', 'Ошибка чтения файла с временными периодами', 5, 3)
		Sleep(5000)
		Exit
	EndIf
	$s_Text = StringRegExpReplace($s_Text, '([\r\n]*$)', '')
	$a_Temp = StringSplit(StringStripCR($s_Text), @LF)
	ReDim $a_Array[$a_Temp[0] + 1][2]
	$a_Array[0][0] = $a_Temp[0]
	For $i = 1 To $a_Temp[0]
		$a_TempString = StringSplit($a_Temp[$i], '-', 2)
		If UBound($a_TempString) <> 2 Then
			TrayTip('Периоды', 'Ошибка в формате файла с временными периодами', 5, 3)
			Sleep(5000)
			Exit
		EndIf
		For $j = 0 To 1
			$a_Array[$i][$j] = StringRegExpReplace($a_TempString[$j], '.*(\d{2})\.(\d{2})\.(\d{4})\s+(\d{2}):(\d{2}).*', '$3$2$1$4$5')
			If @extended <> 5 Then
				TrayTip('Периоды', 'Ошибка в формате файла с временными периодами', 5, 3)
				Sleep(5000)
				Exit
			EndIf
			$a_Array[$i][$j] = Number($a_Array[$i][$j])
		Next
	Next
	For $i = 1 To $a_Array[0][0] - 1
		If $a_Array[$i][0] >= $a_Array[$i][1] Or $a_Array[$i + 1][0] <= $a_Array[$i][1] Then
			ConsoleWrite($i & @LF)
			TrayTip('Периоды', 'Ошибка в формате файла с временными периодами', 5, 3)
			Sleep(5000)
			Exit
		EndIf
	Next
	Return $s_Text
EndFunc   ;==>_CheckFile

Func _PlaySound($i_Index)
	Local $s_Dir = @ScriptDir & '\Resources\', _
			$a_Sound[3][2] = [['start.wav', 'START'],['end.wav', 'END'],['endtoday.wav', 'ENDTODAY']]
	If @Compiled Then
		_WinAPI_PlaySound($a_Sound[$i_Index][1], BitOR($SND_ASYNC, $SND_RESOURCE), _WinAPI_GetModuleHandle(0))
	Else
		SoundPlay($s_Dir & $a_Sound[$i_Index][0])
	EndIf
EndFunc   ;==>_PlaySound
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

madmasles
Очень впечатлительно :shok: и гениально. :ok:Просто нет слов, какими можно было бы вас похвалить. Мастеру высшего класса мои признания. Я наверно вас в затруднения ставлю и прошу, простит меня за неудобства причиненным вам. Вброд бы мелочь, но столько времени отнял у вас. :-[ Но ...
Запустил скрипт. Все шло хорошо. Теперь проверка идет точно и без опоздание. Хвала вам за это. И я решил проверит смену даты. Добавил в конец файла «Condition.txt» вот эти интервалы.
28.11.2011 23:50 - 28.11.2011 23:53
28.11.2011 23:55 - 28.11.2011 23:58
29.11.2011 00:00 - 29.11.2011 00:03
29.11.2011 00:05 - 29.11.2011 00:08
29.11.2011 00:10 - 29.11.2011 00:13
29.11.2011 00:15 - 29.11.2011 00:18
29.11.2011 00:20 - 29.11.2011 00:23
Вызвал аплет и перевел часы 28.11.2011 23:51 и заново запустил скрипт .Получил вот это сообшение «Ошибка в формате файла с временными периодами»
Код:
For $i = 1 To $a_Array[0][0] - 1
        If $a_Array[$i][0] >= $a_Array[$i][1] Or $a_Array[$i + 1][0] <= $a_Array[$i][1] Then
            ConsoleWrite($i & @LF)
            TrayTip('Периоды ', 'Ошибка в формате файла с временными периодами', 5, 3)
            Sleep(5000)
            Exit
        EndIf
    Next

А в консоле было написано - 166
Тепер скрипт на трее показывает белую иконку и все ... Файл «Condition.txt» и Папка Resources лежат рядом со скриптом.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik [?]
Получил вот это сообшение «Ошибка в формате файла с временными периодами»
Функция _CheckFile($s_File) проверяет файл на следующие условия:
1. В каждой строке есть дата и время начала и конца периода.
2. Дата и время начала раньше, чем дата и время конца периода.
3. Дата начала следующего периода позже, чем дата конца предыдущего.
Если это не проверять, то нарушается логика работы скрипта. В консоле написано, что в строке 167 (166+1) - ошибка:
[box title=TitleBox]стр. 166: 28.11.2011 23:55 - 28.11.2011 23:58
стр. 167: 28.11.2011 23:50 - 28.11.2011 23:53 (см. п.3)[/box]

Белая иконка и подпись к ней "На сегодня все" означает, что в файле все сегодняшние периоды обработаны и следующее обращение к файлу будет в 00:00:00 завтра.

При запуске и при смене даты скрипт выбирает из файла периоды только с текущей датой (если начало периода - сегодня, а конец -завтра или позже, то тоже заберет).
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

Понял . Браво, еще раз браво. :thumbs_up:Признаюсь, что совершил ошибку :-[в составлении интервалов. Как всегда вы на высоте :king:. Благодарю за терпения и за желание помогать.+1 ( Хотя вы большего стоите) :smile:
Постараюсь сделать для этого шедевра информационное GUI. Если не получиться … :-[
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

Как получить эти значения из скрипта для вывода информации
Текущий период
Длительность текущего периода ( час,мин)
Время окончания текущего периода ( час,мин)
Следующий период
Время начала следующего периода ( час,мин)
Длительность следующего периода ( час,мин)

Пример
Код:
$sTekPer='31.12.2011 23:00 - 01.01.2012  05:45'
$sHour1 ='06'
$sMin1 ='45'
$sHour11='02'
$sMin11='05'

$sSledPer='01.01.2012 07:00 - 01.01.2012 9:12'
$sHour2 ='03'
$sMin2 ='20'
$sHour22='02'
$sMin22='12'


TrayTip('Периоды ', '    Текущий  период ' & @CRLF & _
$sTekPer & @CRLF & @CRLF & _
'Длительность периода ' & $sHour1  &' час' & $sMin1  &' мин' & @CRLF & _
'До окончания  периода '  & $sHour11  &' час' & $sMin11  &' мин' & @CRLF & @CRLF & _
' Следующий  период' & @CRLF & _
$sSledPer & @CRLF & @CRLF & _
'До начала  периода ' & $sHour2  &' час' & $sMin2  &' мин'& @CRLF & _
'Длительность ' & $sHour22  &' час'& $sMin22  &' мин' & @CRLF , 5, 1)
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
StarEdik,
Попробуйте так.
Код:
#include <Date.au3>
#include <WinAPIEx.au3>

HotKeySet('{Esc}', '_Exit')

$iCount = 0
;в периодах время и даты поправьте
Dim $aText[7] = [6, '01.12.2011 15:40 - 01.12.2011  15:41', '01.12.2011 15:42 - 01.12.2011 15:43', _
		'01.12.2011 15:44 - 01.12.2011  15:45', '01.12.2011 15:46 - 01.12.2011 15:47', _
		'01.12.2011 15:48 - 01.12.2011  15:49', '01.12.2011 15:50 - 01.12.2011 15:53']

Dim $aPeriodInfo[$aText[0] + 1][4]

For $i = 1 To $aText[0]
	$a_TempString = StringSplit($aText[$i], '-')
	If $a_TempString[0] <> 2 Then ContinueLoop
	$iCount += 1
	$aPeriodInfo[$iCount][0] = StringStripWS($aText[$i], 7)
	For $j = 1 To $a_TempString[0]
		$aPeriodInfo[$iCount][$j] = StringStripWS($a_TempString[$j], 7)
		$aPeriodInfo[$iCount][$j] = StringRegExpReplace($aPeriodInfo[$iCount][$j], '^(\d{2})\.(\d{2})\.(\d{4})(.*?)$', '$3/$2/$1$4:00')
		If Not $aPeriodInfo[0][1] Then
			If _DateDiff('s', _NowCalc(), $aPeriodInfo[$iCount][$j]) >= 0 Then
				$aPeriodInfo[0][1] = $iCount
				$aPeriodInfo[0][2] = $j
			EndIf
		EndIf
	Next
	$iDiff = _DateDiff('s', $aPeriodInfo[$iCount][1], $aPeriodInfo[$iCount][2])
	If $iDiff > 86400 Then
		$iDays = Int($iDiff / 86400)
		$sTime = _WinAPI_StrFromTimeInterval(Mod($iDiff, 86400) * 1000)
		$aPeriodInfo[$iCount][3] = $iDays & ' дней ' & $sTime
	Else
		$aPeriodInfo[$iCount][3] = _WinAPI_StrFromTimeInterval($iDiff * 1000)
	EndIf
Next
If Not $iCount Then
	MsgBox(16, 'Error1', 'Нет периодов')
	Exit
EndIf
If $iCount <> $aText[0] Then
	ReDim $aPeriodInfo[$iCount + 1][4]
EndIf
$aPeriodInfo[0][0] = $iCount
$aText = 0

If Not $aPeriodInfo[0][1] And Not $aPeriodInfo[0][2] Then
	MsgBox(16, 'Error2', 'Нет периодов')
	Exit
EndIf

_WinAPI_EmptyWorkingSet()
While 1
	$sMessage = _CalcDiff($aPeriodInfo)
	ToolTip($sMessage, 0, 0)
	Sleep(1000)
WEnd

Func _CalcDiff(ByRef $a_PeriodInfo)
	Local $i_Diff, $i_Days, $s_Time, $s_Message
	$i_Diff = _DateDiff('s', _NowCalc(), $a_PeriodInfo[$a_PeriodInfo[0][1]][$a_PeriodInfo[0][2]])
	If $i_Diff < 0 Then
		If $a_PeriodInfo[0][2] <> 1 Then
			$a_PeriodInfo[0][2] = 1
			$a_PeriodInfo[0][1] += 1
			If $a_PeriodInfo[0][1] > $a_PeriodInfo[0][0] Then
				MsgBox(64, 'Info', 'Периоды закончились')
				Exit
			EndIf
		Else
			$a_PeriodInfo[0][2] = 2
		EndIf
		$s_Message = _CalcDiff($a_PeriodInfo)
	Else
		If $i_Diff > 86400 Then
			$i_Days = Int($i_Diff / 86400)
			$s_Time = $iDays & ' дней ' & _WinAPI_StrFromTimeInterval(Mod($i_Diff, 86400) * 1000)
		Else
			$s_Time = _WinAPI_StrFromTimeInterval($i_Diff * 1000)
		EndIf
		If $a_PeriodInfo[0][2] <> 1 Then
			$s_Message = 'Текущий период: ' & $a_PeriodInfo[$a_PeriodInfo[0][1]][0] & @LF & _
					'Длительность периода : ' & $a_PeriodInfo[$a_PeriodInfo[0][1]][3] & @LF & _
					'До окончания  периода: ' & $s_Time & @LF & @LF & _
					'Сейчас: ' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
		Else
			$s_Message = 'Следующий период: ' & $a_PeriodInfo[$a_PeriodInfo[0][1]][0] & @LF & _
					'Длительность следующего периода : ' & $a_PeriodInfo[$a_PeriodInfo[0][1]][3] & @LF & _
					'До начала следующего периода: ' & $s_Time & @LF & @LF & _
					'Сейчас: ' & @MDAY & '.' & @MON & '.' & @YEAR & ' ' & @HOUR & ':' & @MIN & ':' & @SEC
		EndIf
	EndIf
	Return $s_Message
EndFunc   ;==>_CalcDiff

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 
Автор
StarEdik

StarEdik

Новичок
Сообщения
365
Репутация
4
Re: Как сверить системную дату и время с данными ( временными интервалами ) из ф

madmasles
Попробуйте так.
Попробовать та попробовал и мне понравился ваша идея, но всё это для меня сложно, смысле всё это прикрутит к основному скрипту. Просто думал, что для вывода информации у меня путей несколько.
1) в скрипте, при проверке, (когда делается отметка в консоле) выводить интересующую меня информацию в TrayTip

2) Сделать GUI .При нужде кликнуть пару кликом в трей и показать форму.

Код:
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WinAPIEx.au3>
#include <Date.au3>
Opt("MouseCoordMode",0)
Global $iIndexOld = -10
$Gui = GUICreate('', 284, 264)
$nButtonNow= GUICtrlCreateButton('Сейчас', 210, 2, 70, 20)
$nButtonOpenFile= GUICtrlCreateButton('Open File', 210, 25, 70, 20)
$LabelNow = GUICtrlCreateLabel('', 5, 4, 200, 20,0x1101);0x1000 0x01
;GUICtrlSetData(-1 ,_Now())
GUICtrlSetData(-1 ,@MDAY& "." & @MON & "." & @YEAR & "  " & @HOUR & ":" & @MIN & ":" & @SEC)
GUICtrlSetBkColor(-1, 0x0000FF)
GUICtrlSetColor(-1,0xFFFFFF)
$nLabel =GUICtrlCreateLabel('', 5, 25, 200, 20,0x1101)
GUICtrlSetBkColor(-1, 0xFF00FF)
GUICtrlSetColor($nLabel,0xFFFFFF)
$nListView = GUICtrlCreateListView('', 2, 52, 280, 200, BitOR($LVS_EDITLABELS,$LVS_REPORT, $LVS_SINGLESEL,$LVS_SHOWSELALWAYS,$LVS_EX_BORDERSELECT), $LVS_EX_GRIDLINES)
$hListView = GUICtrlGetHandle($nListView)
_GUICtrlListView_AddColumn($hListView, 'Поиск', 250)
_FileCond()
GUISetState()
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
		Case $nButtonOpenFile
             $sFile = FileOpenDialog('Выберите файл для обработки', _
                    @ScriptDir & '\', 'Текстовые файлы (*.txt)', 1, '', $Gui)

                    If Not FileExists($sFile) Then
						ContinueLoop
					EndIf
                $sText = FileRead($sFile)
                $aText = StringSplit(StringStripCR($sText), @LF)

            Dim $aTextItem[$aText[0]][1]
                For $i = 1 To $aText[0]
                    $aTextItem[$i - 1][0] = $aText[$i]
                Next
                $sText = ''
                $aText = 0
					_GUICtrlListView_DeleteAllItems($hListView)
					_GUICtrlListView_AddArray($hListView, $aTextItem)
		Case $nButtonNow
		    _NowDate_Time()
	EndSwitch

	WinSetOnTop($Gui,"",1)

WEnd

Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
    Local $tNMHDR, $hWndFrom, $iCode, $tInfo, $iIndexNow, $sNewText
    $tNMHDR = DllStructCreate($tagNMHDR, $lParam)
    $hWndFrom = DllStructGetData($tNMHDR, 'hWndFrom')
    $iCode = DllStructGetData($tNMHDR, 'Code')

    Switch $hWndFrom
        Case $hListView
            Switch $iCode
                Case $LVN_ITEMCHANGING
                    $tInfo = DllStructCreate($tagNMITEMACTIVATE, $lParam)
                    $iIndexNow = DllStructGetData($tInfo, 'Index')
                    If $iIndexOld <> $iIndexNow Then
                        $iIndexOld = $iIndexNow
						GUICtrlSetData($nLabel, _GUICtrlListView_GetItemText($hListView, $iIndexOld))
                    EndIf
			EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NOTIFY

Func _NowDate_Time()
    $date = (@MDAY& "." & @MON & "." & @YEAR & "  " & @HOUR & ":" & @MIN & ":" & @SEC)
GUICtrlSetData($LabelNow ,$date)
EndFunc
Func _FileCond()
 $sFile = @ScriptDir & '\Condition.txt'

                    If Not FileExists($sFile) Then
					;	ContinueLoop
					EndIf
                $sText = FileRead($sFile)
                $aText = StringSplit(StringStripCR($sText), @LF)

            Dim $aTextItem[$aText[0]][1]
                For $i = 1 To $aText[0]
                    $aTextItem[$i - 1][0] = $aText[$i]
                Next
                $sText = ''
                $aText = 0
					_GUICtrlListView_DeleteAllItems($hListView)
					_GUICtrlListView_AddArray($hListView, $aTextItem)
EndFunc


3) MsgBox

4)…
 
Верх