Covil Do Dev

Manipulando data e hora em Python com datetime

Conheça o módulo datetime e domine os objetos date, time, datetime e timedelta. Além disso, você aprenderá a converter data e hora em string e vice-versa além de aprender a lidar com fuso horário.


Lindomar Rodrigues
Lindomar Rodrigues

Atualizado

O módulo datetime do Python serve para trabalhar com datas e horas.

Inicialmente faremos alguns programas simples e depois iremos nos aprofundando.

Hora e data atual do sistema

Para exibir a hora atual do seu sistema basta fazer da seguinte forma:

import datetime

hora_atual = datetime.datetime.now()
print(hora_atual)

Na primeira linha importamos o módulo datetime.

Em seguida, usamos o método now() da classe datetime contida no módulo datetime para criar um objeto datetime contendo a data e hora atual.

Ao executar o programa, a saída será algo como:

2022-01-22 17:17:47.656306

Data atual do sistema

Para exibir apenas a data podemos utilizar o método today() definido na classe date para obter um objeto date contendo a data atual.

import datetime

data_atual = datetime.date.today()
print(data_atual)

Ao executar o programa, a saída será algo como:

2022-01-22

classe datetime.date()

Você pode instanciar um objeto date da classe date.

Um objeto da classe date representa uma data(ano, mês e dia).

Objeto date representando uma data

import datetime

data = datetime.date(2022, 3, 20)
print(data)

Ao executar o programa, a saída será:

2022-03-20

No exemplo acima, date() é um construtor da classe date.

O construtor recebe três argumentos: ano, mês e dia.

A variável data é um objeto date.

Podemos importar a classe date do módulo datetime. Veja como:

from datetime import date

data = date(2022, 3, 20)
print(data)

Obtendo a data de um timestamp

Também podemos criar objetos date a partir de um timestamp.

Um timestamp Unix é o número de segundos entre uma data específica e 1.º de janeiro de 1970 em UTC.

Você pode converter um timestamp de data/hora em data usando o método fromtimestamp().

from datetime import date

data = date.fromtimestamp(1647794364)
print(data)

Ao executar o programa, a saída será:

2022-03-20

Exiba o ano, mês e dia de hoje

Podemos obter ano, mês, dia, dia da semana, etc. do objeto de data facilmente. Veja como:

from datetime import date

data = date.today()

print("Ano atual:", data.year)
print("Mês atual:", data.month)
print("Dia atual:", data.day)

Ao executar o programa, a saída será algo como:

Ano atual: 2022
Mês atual: 1
Dia atual: 22

datetime.hour()

Um objeto hour da classe time representa a hora local.

Objeto time para representar o tempo

from datetime import time

# time(hora=0, minuto=0, segundo=0)
a = time()
print("a =", a)

# time(hora, minuto e segundo)
b = time(20, 30, 0)
print("b =", b)

# time(hora, minuto e segundo)
c = time(hour=21, minute=31, second=11)
print("c =", c)

# time(hora, minuto, segundo e microsegundo)
d = time(21, 31, 1, 123640)
print("d =", d)

Ao executar o programa, a saída será:

a = 00:00:00
b = 20:30:00
c = 21:31:11
d = 21:31:01.123640

Exibir hora, minuto, segundo e microssegundo

Após criar um objeto time, você pode imprimir facilmente seus atributos, como hora, minuto, etc.

from datetime import time

a = time(12, 30, 0)

print("Hora =", a.hour)
print("Minuto =", a.minute)
print("Segundo =", a.second)
print("Microssegundo =", a.microsecond)

Ao executar o exemplo, a saída será:

Hora = 12
Minuto = 30
Segundo = 0
Microssegundo = 0

Observe que não passamos o argumento microssegundo. Portanto, seu valor padrão 0 é impresso.

datetime.datetime

O módulo datetime tem uma classe chamada datetime que pode conter informações de objetos de data e hora.

Objeto datetime do Python

from datetime import datetime

# datetime(ano, mês, dia)
a = datetime(2022, 3, 20)
print(a)

# datetime(ano, mês, dia, hora, minuto, segundo, microsegundo)
b = datetime(2022, 3, 20, 12, 30, 30, 100000)
print(b)

Ao executar o programa, a saída será:

2022-03-20 00:00:00
2022-03-20 12:30:30.100000

Os três primeiros argumentos ano, mês e dia no construtor datetime() são obrigatórios.

Exibir ano, mês, hora, minuto e timestamp

from datetime import datetime

a = datetime(2022, 3, 20, 12, 30, 30, 100000)
print("Ano =", a.year)
print("Mês =", a.month)
print("Hora =", a.hour)
print("Minuto =", a.minute)
print("Timestamp =", a.timestamp())

Ao executar o programa, a saída será:

Ano = 2022
Mês = 3
Hora = 12
Minuto = 30
Timestamp = 1647790230.1

datetime.timedelta

Um objeto timedelta representa a diferença entre duas datas ou horas.

Diferença entre duas datas e horas

from datetime import datetime, date

t1 = date(year=2022, month=1, day=22)
t2 = date(year=2002, month=3, day=20)
t3 = t1 - t2
print("t3 =", t3)

t4 = datetime(year=2022, month=1, day=22, hour=12, minute=30, second=30)
t5 = datetime(year=2002, month=3, day=20, hour=9, minute=50, second=45)
t6 = t4 - t5
print("t6 =", t6)

print("Tipo de t3 =", type(t3))
print("Tipo de t6 =", type(t6))

Ao executar o programa, a saída será:

t3 = 7248 days, 0:00:00
t6 = 7248 days, 2:39:45
Tipo de t3 = <class 'datetime.timedelta'>
Tipo de t6 = <class 'datetime.timedelta'>

Observe, ambos t3 e t6 são do tipo <class 'datetime.timedelta'>.

Diferença entre dois objetos timedelta

from datetime import timedelta

t1 = timedelta(weeks=2, days=5, hours=1, seconds=33)
t2 = timedelta(days=4, hours=11, minutes=4, seconds=54)
t3 = t1 - t2

print("t3 =", t3)

Ao executar o programa, a saída será:

t3 = 14 days, 13:55:39

Aqui, criamos dois objetos timedelta, t1 e t2, e sua diferença é impressa na tela.

Exibindo objeto timedelta negativo

from datetime import timedelta

t1 = timedelta(seconds=33)
t2 = timedelta(seconds=4)
t3 = t1 - t2

print("t3 =", t3)
print("t3 =", abs(t3))

Ao executar o programa, a saída será:

t3 = 0:00:29
t3 = 0:00:29

Duração de um objeto timedelta em segundos

Você pode obter o número total de segundos em um objeto timedelta usando o método total_seconds().

from datetime import timedelta

t = timedelta(days=5, hours=1, seconds=33, microseconds=233423)
print("Segundos totais =", t.total_seconds())

Ao executar o programa, a saída será:

Segundos totais = 435633.233423

Você também pode encontrar a soma de duas datas e horas usando o operador +.

Além disso, você pode multiplicar e dividir um objeto timedelta por inteiros e floats.

formatação do datetime em Python

Como a data e a hora são representadas pode diferir em diferentes lugares, organizações, etc.

É mais comum usar mm/dd/yyyy nos EUA, enquanto dd/mm/yyyy é mais comum no Brasil.

Python tem os métodos strftime() e strptime() para lidar com isso.

Python strftime() - objeto datetime para string

O método strftime() é definido na classe date.

O método cria uma string formatada a partir de um determinado objeto datetime, time, date, datetime ou time.

Formatar data usando strftime()

from datetime import datetime

# Data e hora atual
atual = datetime.now()

t = atual.strftime("%H:%M:%S")
print("Hora:", t)

s1 = atual.strftime("%m/%d/%Y, %H:%M:%S")

# mm/dd/YY H:M:S
print("s1:", s1)

s2 = atual.strftime("%d/%m/%Y, %H:%M:%S")
# dd/mm/YY H:M:S
print("s2:", s2)

Ao executar o programa, a saída será algo como:

Hora: 17:54:16
s1: 01/22/2022, 17:54:16
s2: 22/01/2022, 17:54:16

Aqui, %Y, %m, %d, %H são códigos de formato.

O método strftime() recebe um ou mais códigos de formato e retorna uma string formatada com base nele.

No programa acima, t, s1 e s2 são strings.

  • %Y - ano [0001,..., 2018, 2019,..., 9999]
  • %m - mês [01, 02, ..., 11, 12]
  • %d - dia [01, 02, ..., 30, 31]
  • %H - hora [00, 01, ..., 22, 23
  • %M - minuto [00, 01, ..., 58, 59]
  • %S - segundo [00, 01, ..., 58, 59]

Python strptime() - string para datetime

O método strptime() cria um objeto datetimea partir de uma determinada string (representando data e hora).

strptime()

from datetime import datetime

string = "21 June, 2018"
print("string =", string)

data = datetime.strptime(string, "%d %B, %Y")
print("Data =", data)

Ao executar o programa, a saída será:

string = 21 June, 2018
Data = 2018-06-21 00:00:00

O método strptime() recebe dois argumentos:

  1. uma string representando data e hora
  2. código de formato equivalente ao primeiro argumento

A propósito, %d, %B e %Y são códigos de formato usados para dia, mês(nome completo) e ano respectivamente.

Manipulando o fuso horário em Python

Suponha que você esteja trabalhando em um projeto e precise exibir a data e a hora com base no fuso horário.

Em vez de tentar lidar com o fuso horário por conta própria, sugerimos que você use um módulo chamado pytZ.

from datetime import datetime
import pytz

local = datetime.now()
print("Local:", local.strftime("%m/%d/%Y, %H:%M:%S"))


tz_NY = pytz.timezone('America/New_York')
datetime_NY = datetime.now(tz_NY)
print("NY:", datetime_NY.strftime("%m/%d/%Y, %H:%M:%S"))

tz_Brasilia = pytz.timezone('Brazil/West')
datetime_Brasilia = datetime.now(tz_Brasilia)
print("Brasília:", datetime_Brasilia.strftime("%m/%d/%Y, %H:%M:%S"))

Ao executar o programa, a saída será algo como:

Local: 01/22/2022, 18:01:11
NY: 01/22/2022, 16:01:11
Brasília: 01/22/2022, 17:01:11

Obrigado por visitar o blog e por ler esse artigo, se tive qualquer dúvida, ideia ou sugestão, não hesite em entrar em contato pelo meu e-mail: lindomar@covildodev.com.br