Fazendo um despertador – como trabalhar com data e hora em Python

Além de aprender a trabalhar com data e hora em Python veremos também como importar outras bibliotecas no seu código.

Como utilizar as bibliotecas do Python no seu código

Para trabalhar com hora em Python é preciso entender o conceito de módulos. Até agora estivemos trabalhando com nossos códigos em apenas um arquivo. Mas esta não é a realidade de software profissional pois a grande quantidade de código torna inviável trabalhar em um arquivo único. O mecanismo que o Python utiliza para separar o código em vários pedaços menores é o módulo. E é muito simples: cada módulo é um arquivo diferente com a extensão .py.

Se você quer utilizar a função definida em outro módulo precisa utilizar o comando import. Este comando faz todas as funções definidas no arquivo que está importando ficarem disponíveis.

import meu_modulo

print(meu_modulo.calcular_desconto)

Note que ao importar o módulo não é preciso utilizar a extensão .py apenas o nome do arquivo.

No Python muitas funcionalidades estão disponíveis em módulos, essa separação serve para que você inclua no seu programa apenas aquilo que vai utilizar. Se não fosse assim seu programa seria imenso pois conteria todas as funções disponíveis no Python.

Objeto datetime

Começaremos importanto o módulo datetime, ele possui um objeto também chamado datetime que contém várias funções relacionadas a datas e horários em Python. A função now() retorna o horário atual da máquina. Se você executar o script abaixo no repl vai notar que o horário não bate com o seu horário local. Isto ocorre por que o computador que está rodando o repl está configurado em outro horário, o que chamamos de UTC (Coordinated Universal Time), que é o mesmo que o GMT zero.

import datetime

print(datetime.datetime.now()) # 2020-01-05 04:25:55.243137

Nosso despertador permitirá ao usuário escolher o horário em que deseja acordar e também o dia da semana. Para isto, precisaremos pedir esta informação para ele.]

print("+++++++++++++++++++++++++++++++")
print("DESPERTADOR")
print("+++++++++++++++++++++++++++++++")

hora_string = input("Que horas quer acordar? (hh:mm): ")
dia_da_semana_string = input("Que dias da semana? (seg ter qua qui sex sab dom): ")

Horas

Vamos receber o horário no formato hh:mm precisamos separar a hora e o minuto em duas variáveis diferentes. Para isto vamos utilizar a função split da string que vimos no post dominando strings em Python.

hora = int(hora_string.split(':')[0])
minuto = int(hora_string.split(':')[1])

Com a informação de hora e minuto podemos criar uma lógica que indica se está na hora de acordar. Para isto utilizaremos as propriedadas hour e minute do objeto datetime. A função esta_na_hora receberá a hora e minuto digitadas pelo usuário e também a data e hora atual e retornará True caso o horário atual seja igual ao escolhido pelo usuário.

def esta_na_hora(hora, minuto, hora_atual):
  if hora_atual.hour == hora and hora_atual.minute == minuto:
    return True
  return False

Dias da semana

Utilizaremos os nomes seg, ter, qua, qui, sex, sab, dom para identificar os dias da semana. O usuário poderá escolher mais de um dia da semana, para isto basta digitar os nomes com um espaço. Para despertar toda segunda e quarta, por exemplo, ele pode utilizar “seg qua”.

dias_da_semana = dia_da_semana_string.split(' ')

A variável dias_da_semana contém uma lista com os dias da semana que o usuário selecionou, no entanto o Python não entende essa nomenclatura. O que é comum em várias linguagens de programação é utilizar uma numeração para identificar os dias da semana. Para o Python por exemplo segunda-feira é indicada por 0, terça-feira por 1 e assim por diante, até domingo que é indicado pelo número 6.

O que queremos fazer é transformar este array de strings de dias da semana em seus representantes numéricos em Python, então vamos criar uma função para fazer isto para nós.

def processar_dias_da_semana(dias_da_semana_string):
  dias_da_semana = []

  for dia in dias_da_semana_string:
    if dia == "seg":
      dias_da_semana.append(0)
    if dia == "ter":
      dias_da_semana.append(1)
    if dia == "qua":
      dias_da_semana.append(2)
    if dia == "qui":
      dias_da_semana.append(3)
    if dia == "sex":
      dias_da_semana.append(4)
    if dia == "sab":
      dias_da_semana.append(5)
    if dia == "dom":
      dias_da_semana.append(6)

  return dias_da_semana

Nesta função estamos utilizando a função append da lista  que aprendemos no post Listas de objetos e laço FOR em Python. A função retorna uma lista com os números que representam os dias da semana. Então se passarmos [“seg”, “qua”] a função nos retornará [0, 2].

Podemos utilizar a função criada para processar a lista de dias da semana recebida do usuário.

dia_da_semana_string = input("Que dias da semana? (seg ter qua qui sex sab dom): ")
dias_da_semana = dia_da_semana_string.split(' ')
dias_da_semana_int = processar_dias_da_semana(dias_da_semana)

Precisamos fazer agora uma função que nos indica se o dia da semana atual foi configurado pelo usuário para despertar. Para isto utilizaremos a função weekday() que retorna um número de 0 a 6 indicando o dia da semana.  A função deve receber a data e hora atual e também a lista de dias desejados.

def esta_no_dia_da_semana(dias_desejados, data_atual):
  if data_atual.weekday() in dias_desejados:
    return True
  return False

A função sleep

Precisaremos fazer nosso despertador checar de tempos em tempos se está na hora de acordar ou não. Para isto podemos utilizar a função sleep do módulo time. Essa função faz o Python “dormir” ou seja, ele não processa nada enquanto está dormindo. Como nosso despertador é baseado em horas e minutos o ideal é checar a cada 1 minuto se está na hora de acordar.

Vamos utilizar um while infinito para deixar o despertador em execução.

import time

while True:
	# lógica para despertar
   time.sleep(60)

O código acima permanece em execução até que o usuário cancele. A função sleep recebe um número inteiro que representa os segundos em que ficará inativo. O código acima “acorda” a cada 60 segundos para identificar se está na hora de acordar.

Agora só nos resta implementar a lógica para identificar se é hora de acordar ou não.

while True:
  now = datetime.datetime.now()

  if esta_na_hora(hora, minuto, now) and esta_no_dia_da_semana(dias_da_semana_int, now):
    print("ACORDAR")

  time.sleep(60)

A primeira linha utiliza função now() para guardar a data e hora atuais. E então o if identifica se está na hora de acordar e se o dia da semana está correto. Se as duas funções retornarem True, a palavra “ACORDAR” é impressa. Depois desta validação pedimos para o Python dormir por 60 segundos. Após 60 segundos, o laço while volta ao início e executa o mesmo procedimento.

Versão final do despertador: https://repl.it/@julianajuliano/Despertador