contagem regressiva em dias Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

Lazyyy
Posts: 51
Joined: 27 Jan 2020, 21:56

contagem regressiva em dias

03 Jun 2020, 03:25

Bom dia, queria saber como posso fazer o meu script mostrar uma contagem regressiva em dias no MsgBox, começando do 3 e indo até o 1.
Por exemplo: Se eu abro o meu script hoje, ele deverá mostrar o seguinte no MsgBox: "dia 3", no dia seguinte, ele deverá mostrar: "dia 2" e no terceiro: "dia 1"

É possível? Não precisa usar data online, pode ser algum comando do windows mesmo.
User avatar
Gio
Posts: 1075
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: contagem regressiva em dias  Topic is solved

03 Jun 2020, 09:56

Bom dia Lazyyy.

Sua pergunta tem várias respostas possíveis. Para apresentar uma proposta de solução, vou dividir a resposta em duas partes: Primeiro vamos entender como as datas e horas podem ser calculadas no AutoHotkey e depois seguimos para a outra parte.

Quando uma data está no formato AAAAMMDDhhmmss (YYYYMMDDHH24MISS em inglês) você pode utilizar o comando EnvAdd para somar ou subtrair dias, meses, anos ou qualquer outra porção de tempo dela.

AAAA é o ano com quatro dígitos
MM é o mês com dois dígitos (incluindo o zero se for menor que 10)
DD é o dia com dois dígitos (incluindo o zero se for menor que 10)
hh é a hora com dois dígitos e no formato de 24 horas (incluindo o zero se for menor que 10)
mm são os minutos com dois dígitos (incluindo o zero se for menor que 10)
ss são os segundos com dois dígitos (incluindo o zero se for menor que 10)

Exemplo: 20200603093315 é equivalente a: 03/06/2020 às 09:33:15.

Exemplo do EnvAdd subtraindo um dia da data da execução do script e exibindo o resultado por três vezes:

Code: Select all

VAR := A_Now ; A variável embutida A_Now retorna a data e hora do momento da execução no formato AAAAMMDDhhmmss
DATA_FORMATADA := SubStr(VAR, 7, 2) . "/" . SubStr(VAR, 5, 2)  . "/" . SubStr(VAR, 1, 4) 
msgbox, 0, Bom dia, Hoje é %DATA_FORMATADA%

EnvAdd, VAR, -1, d
DATA_FORMATADA := SubStr(VAR, 7, 2) . "/" . SubStr(VAR, 5, 2)  . "/" . SubStr(VAR, 1, 4) 
msgbox, 0, Bom dia, Ontem foi %DATA_FORMATADA%

EnvAdd, VAR, -1, d
DATA_FORMATADA := SubStr(VAR, 7, 2) . "/" . SubStr(VAR, 5, 2)  . "/" . SubStr(VAR, 1, 4) 
msgbox, 0, Bom dia, e ANTEONTEM foi %DATA_FORMATADA%

Além disso, pode também usar o comando EnvSub para subtrair uma data da outra.

Code: Select all

HOJE := A_Now ; A_Now contém a data e a hora da execução no formato AAAAMMDDhhmmss (YYYYMMDDHH24MISS em inglês)
ONTEM := "20200602"
EnvSub, HOJE, %ONTEM%, days ; A variável HOJE foi transformada aqui, então ela não conterá mais a informação da data de hoje (e sim a diferença)
msgbox , 0, Bom dia, Entre as datas HOJE e ONTEM existe uma diferença de %HOJE% dias.


HOJE := A_Now ; Reescrevemos a variável HOJE com a data de hoje.
ANTEONTEM := "20200601"
EnvSub, HOJE, %ANTEONTEM%, days ; A variável HOJE foi transformada aqui, então ela não conterá mais a informação da data de hoje (e sim a diferença)
msgbox , 0, Bom dia, Entre as datas HOJE e ANTEONTEM existe uma diferença de %HOJE% dias.

:arrow: Agora vamos para a outra parte da pergunta: Como o script poderia criar uma âncora de data entre as execuções (ou seja, saber que na execução de hoje deve diminuir 1 em relação a de ontem).

Os programas rodam no computador em memória volátil (memória RAM). Isso significa que quando termina a execução de um programa, tudo o que ele tinha nas suas variáveis simplesmente some. Mas o programa pode a qualquer momento da sua execução salvar informações na memória NÃO-volátil do computador: O disco rígido (ou HD). Para fazer isso, basta escrever um arquivo. Você pode escrever um arquivo de texto usando vários comandos, sendo que o mais direto é o FileAppend.

Sendo assim, para fazer o que você quer, o script teria que:

1. Na primeira execução, criar um arquivo com a data atual (preferêncialmente no formato AAAAMMDDhhmmss (YYYYMMDDHH24MISS em inglês). Você pode saber que é a primeira execução verificando que o arquivo não existe ainda (use a função FileExist() para isso).
2. Nas próximas execuções, o script vai simplesmente diminuir a data salva no arquivo da data da execução (obtida colocando em uma variável sua o conteúdo da variável embutida A_now), encontrando a diferença em dias através do comando EnvSub.
3. Depois, é só exibir a expressão literal "dia " seguida do resultado de "3 menos a diferença encontrada" em uma Msgbox.

Exemplo:

Code: Select all

If (FileExist(A_ScriptDir . "/DATA_PRIMEIRA.hini"))
{
	FileRead, CONTEUDO_DO_ARQUIVO, %A_ScriptDir%/DATA_PRIMEIRA.hini
	DATA_ATUAL := A_now
	EnvSub, DATA_ATUAL, %CONTEUDO_DO_ARQUIVO%, days ; Neste comando, DATA_ATUAL é retrabalhada, portanto ela deixa de conter de fato a data da execução e passa a conter apenas a diferença.
	msgbox % "dia " . 3 - DATA_ATUAL
}
else
{
	FileAppend, %A_now%, %A_ScriptDir%/DATA_PRIMEIRA.hini
	msgbox % "dia 3"
}

DICA: Datas no formato AAAAMMDDhhmmss (YYYYMMDDHH24MISS em inglês) também são muito úteis em comparações de datas, pois uma data anterior sempre é um número menor que o de uma data posterior quando ambas estão neste formato.

Espero ter ajudado, se ainda tiver alguma dúvida sobre essa questão, basta postar abaixo :beer:

Return to “Ajuda e Suporte Geral”

Who is online

Users browsing this forum: No registered users and 2 guests