Módulo Time
O módulo time fornece funções para manipulação de tempo e datas. Este módulo é útil para scripts que precisam medir intervalos, aguardar por períodos específicos, parsear datas e implementar timeouts em operações assíncronas.
Características principais:
- Timestamps Unix em segundos
- Parse de datas no formato RFC 3339
- Sleep assíncrono não-bloqueante
- Timeouts para operações assíncronas
Funções Disponíveis
1. time.now()
Retorna o timestamp Unix atual em segundos.
Parâmetros:
- Nenhum
Retorno:
- número: Timestamp Unix atual (segundos desde 1 de Janeiro de 1970, 00:00:00 UTC)
Comportamento:
- Retorna o tempo atual em UTC
- Precisão de segundos (não milissegundos)
- Mesmo valor retornado por
os.time()em Lua padrão - Disponível como função global e no módulo
time
Exemplo de Uso:
-- Usando o módulo time
local timestamp_modulo = time.now()
print("Timestamp módulo:", timestamp_modulo)
-- Usando a função global (mesma função)
local timestamp_global = now()
print("Timestamp global:", timestamp_global)
-- Ambos retornam o mesmo valor
print("São iguais?", timestamp_global == timestamp_modulo) -- true
-- Calcular duração de operação
local inicio = time.now()
-- ... operação demorada ...
local fim = time.now()
local duracao = fim - inicio
print("Operação levou", duracao, "segundos")
-- Registrar eventos com timestamp
local evento = {
tipo = "login",
usuario = "admin",
timestamp = now(),
origem = system.hostname()
}
-- Agendar execução futura
local proxima_execucao = time.now() + 3600 -- 1 hora a partir de agora
print("Próxima execução em:", os.date("%H:%M:%S", proxima_execucao))
2. time.sleep(segundos)
Aguarda assincronamente por um número específico de segundos.
Parâmetros:
- segundos (número): Número de segundos para aguardar
Retorno:
- nil: A função não retorna valor (após a espera)
Comportamento:
- Precisão dependente do scheduler do sistema
Exemplo de Uso:
-- Aguardar 5 segundos
await(time.sleep(5))
print("5 segundos se passaram")
-- Implementar polling com intervalo
local function poll_com_intervalo(url, intervalo_segundos, max_tentativas)
for tentativa = 1, max_tentativas do
log.info("Tentativa", tentativa, "de", max_tentativas)
-- Fazer requisição
local resposta, status = http.get(url)
if status == 200 then
log.info("Sucesso na tentativa", tentativa)
return resposta
end
-- Aguardar antes da próxima tentativa
if tentativa < max_tentativas then
log.info("Aguardando", intervalo_segundos, "segundos...")
time.sleep(intervalo_segundos)
end
end
log.error("Todas as tentativas falharam")
return nil
end
-- Uso
local dados = poll_com_intervalo("https://api.exemplo.com/status", 10, 6)
-- Controle de execução com backoff exponencial
local function executar_com_backoff(funcao, max_tentativas)
local tentativa = 1
while tentativa <= max_tentativas do
local ok, resultado = pcall(funcao)
if ok then
return resultado
end
-- Backoff exponencial: 2^(tentativa-1) segundos
local wait_time = math.pow(2, tentativa - 1)
log.warn("Tentativa", tentativa, "falhou. Aguardando", wait_time, "segundos")
if tentativa < max_tentativas then
time.sleep(wait_time)
end
tentativa = tentativa + 1
end
error("Todas as tentativas falharam")
end
3. time.parse(string_data)
Parseia uma string de data/hora no formato RFC 3339 e retorna um objeto de data.
Parâmetros:
- string_data (string): Data/hora no formato RFC 3339 (ex: "2024-01-15T10:30:00Z")
Retorno:
-
objeto LuaDateTime: Objeto com método
seconds()que retorna timestamp Unix
Formato RFC 3339:
-
YYYY-MM-DDTHH:MM:SSZ(UTC) -
YYYY-MM-DDTHH:MM:SS+HH:MM(com offset de fuso horário) - Exemplos: "2024-01-15T10:30:00Z", "2024-01-15T07:30:00-03:00"
Exemplo de Uso:
-- Parsear data UTC
local data_utc = time.parse("2024-01-15T10:30:00Z")
local timestamp_utc = data_utc:seconds()
print("Timestamp UTC:", timestamp_utc) -- 1705314600
-- Parsear data com offset de fuso
local data_local = time.parse("2024-01-15T07:30:00-03:00")
local timestamp_local = data_local:seconds()
print("Timestamp local:", timestamp_local) -- 1705314600 (mesmo momento)
-- Converter para formato legível
local function formatar_data_rfc3339(timestamp)
return os.date("%Y-%m-%dT%H:%M:%SZ", timestamp)
end
-- Calcular diferença entre datas
local data1 = time.parse("2024-01-15T10:30:00Z")
local data2 = time.parse("2024-01-15T11:45:00Z")
local diferenca = data2:seconds() - data1:seconds()
print("Diferença:", diferenca, "segundos (", diferenca/60, "minutos)")
-- Validar e parsear data de entrada
local function parsear_data_segura(data_string)
local ok, data = pcall(time.parse, data_string)
if ok then
return data:seconds()
else
log.error("Data inválida:", data_string, "-", data)
return nil
end
end
-- Uso
local timestamp = parsear_data_segura("2024-01-15T10:30:00Z")
if timestamp then
print("Data válida:", os.date("%d/%m/%Y %H:%M:%S", timestamp))
end