Что нового

[Время, дата] Отсчёт времени до ежедневного события

dimcomp

Новичок
Сообщения
66
Репутация
0
Версия AutoIt: 3.3.8.1
Описание: Нужно написать скрипт обратный отсчёт времени до события, чтобы событие выполнялось ежедневно в определённое время с выводом в окне GUI в статус баре _GUICtrlStatusBar_SetText. Допустим каждый день в 14 часов 5 минут и 20 часов 10 минут. то есть до 14:05 осталось столько то часов, минут, секунд, после этого выводится сообщение (например начались спокойной ночи малыши) и минут через 10, новое сообщение что до 20:10 осталось n часов, минут, секунд, и так ежедневно.
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
Написал код
Код:
#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>

Global $String, $tur

$DATE1= "01:00:00"
$DATE2= "08:00:00"
$DATE3= "12:00:00"
$DATE4= "22:00:00"

$hGUI = GUICreate("Пример", 500, 150)

$StatusBar1 = _GUICtrlStatusBar_Create($hGUI)
Dim $StatusBar1_PartsWidth[2] = [500, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)

AdlibRegister("_Ostatok",1000)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            ExitLoop
    EndSwitch      
Sleep(30)      
WEnd

Func _Ostatok()

$DATE="2020/01/1 01:00:00"
$tur="ночь"

if _NowTime() > $DATE1 and _NowTime() < $DATE2 then
$DATE="2020/01/1 08:00:00"
$tur="С добрым утром"
endif

if _NowTime() > $DATE2 and _NowTime() < $DATE3 then
$DATE="2020/01/1 12:00:00"
$tur="обед"
endif

if _NowTime() > $DATE3 and _NowTime() < $DATE4 then
$DATE="2020/01/1 22:00:00"
$tur="Всем спать"
endif

$iDateCalc = _DateDiff("s",$DATE,_NowCalc())

$day= Ceiling ($iDateCalc/(3600*24))
$hour= Ceiling( Mod($iDateCalc, (3600*24))/3600)
$min=Ceiling((Mod($iDateCalc,(3600*24))-$hour*3600)/60)
$sec=($min*60+$hour*3600+$day*3600*24)-$iDateCalc

    if Abs($hour) >=0 and Abs($hour) <=9 then
	   $hour="0"&Abs($hour)
	    else
	   $hour=Abs($hour)
	endif
	
	if Abs($min) >=0 and Abs($min) <=9 then	  
	   $min="0"&Abs($min)
	   else
	   $min=Abs($min)
	endif
	
	if Abs($sec) >=0 and Abs($sec) <=9 then
	   $sec="0"&Abs($sec)
	   else
	   $sec=Abs($sec)
	endif

_GUICtrlStatusBar_SetText($StatusBar1, "Дно начала программы " &($tur)& " осталось: "&$hour&":"&$min&":"&$sec&"", 0)

    If  $hour = 00 and  $min = 00 and $sec = 01 Then
_GUICtrlStatusBar_SetText($StatusBar1, "Идёт программа "&($tur)&"", 0)
Sleep(10000)
    endif

EndFunc


Но есть проблема, при переходе к
Код:
if _NowTime() > $DATE2 and _NowTime() < $DATE3 then
она не может понять что больше а что меньше. Как исправить?
Дополню, ошибка происходит если системное время меньше 10:00
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Разберитесь со сравнением строк

Код:
$DATE1= "1:00:00"
$DATE2= "8:00:00"
$DATE3= "12:00:00"
$DATE4= "22:00:00"

If $DATE2 > $DATE3 Then
	MsgBox(0,"",$DATE2&" > "&$DATE3)
Else
	MsgBox(0,"",$DATE3&" > "&$DATE2)
EndIf
 
Автор
D

dimcomp

Новичок
Сообщения
66
Репутация
0
C2H5OH сказал(а):
Разберитесь со сравнением строк
Исправил дату 1 и 2 на 01 и 08 соответственно, всё равно не может сравнить


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

Я так понимаю что системное время округляет часы вместо 09 на 9 из-за этого _NowTime() (9:00:00) не может сравить с $DATE3 (12:00:00) так вот, как системное время перевести к виду 09:00:00?


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

Сделал так, вроде работает, если есть способ проще - буду рад :smile:
Код:
#include <Date.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>

Global $String, $tur

$DATE1= "1:00:00"
$DATE2= "8:00:00"
$DATE21= "9:59:59"
$DATE22= "10:00:00"
$DATE3= "12:00:00"
$DATE4= "22:00:00"
$DATE41= "23:59:59"
$DATE42= "0:00:00"

$hGUI = GUICreate("Пример", 500, 150)

$StatusBar1 = _GUICtrlStatusBar_Create($hGUI)
Dim $StatusBar1_PartsWidth[2] = [500, -1]
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)

AdlibRegister("_Ostatok",1000)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            GUIDelete()
            ExitLoop
    EndSwitch      
Sleep(30)      
WEnd

Func _Ostatok()  

if _NowTime() > $DATE1 and _NowTime() < $DATE2 then
$DATE="2020/01/1 08:00:00"
$tur="С добрым утром"
endif

if _NowTime() > $DATE2 and _NowTime() <= $DATE21 then
$DATE="2020/01/1 12:00:00"
$tur="обед"
endif

if _NowTime() >= $DATE22 and _NowTime() < $DATE3 then
$DATE="2020/01/1 12:00:00"
$tur="обед"
endif

if _NowTime() > $DATE3 and _NowTime() < $DATE4 then
$DATE="2020/01/1 22:00:00"
$tur="Всем спать"
endif

if _NowTime() > $DATE4 and _NowTime() <= $DATE41 then
$DATE="2020/01/1 01:00:00"
$tur="ночь"
endif

if _NowTime() >= $DATE42 and _NowTime() < $DATE1 then
$DATE="2020/01/1 01:00:00"
$tur="ночь"
endif

$iDateCalc = _DateDiff("s",$DATE,_NowCalc())

$day= Ceiling ($iDateCalc/(3600*24))
$hour= Ceiling( Mod($iDateCalc, (3600*24))/3600)
$min=Ceiling((Mod($iDateCalc,(3600*24))-$hour*3600)/60)
$sec=($min*60+$hour*3600+$day*3600*24)-$iDateCalc

    if Abs($hour) >=0 and Abs($hour) <=9 then
	   $hour="0"&Abs($hour)
	    else
	   $hour=Abs($hour)
	endif
	
	if Abs($min) >=0 and Abs($min) <=9 then	  
	   $min="0"&Abs($min)
	   else
	   $min=Abs($min)
	endif
	
	if Abs($sec) >=0 and Abs($sec) <=9 then
	   $sec="0"&Abs($sec)
	   else
	   $sec=Abs($sec)
	endif

_GUICtrlStatusBar_SetText($StatusBar1, "До начала программы " &($tur)& " осталось: "&$hour&":"&$min&":"&$sec&"", 0)

    If  $hour = 00 and  $min = 00 and $sec = 01 Then
_GUICtrlStatusBar_SetText($StatusBar1, "Идёт программа "&($tur)&"", 0)
Sleep(100000)
    endif

EndFunc
 
Верх