Módulo Python Datetime
O módulo Datetime permite-nos trabalhar com objetos de data e hora. Ele fornece três tipos de dados adicionais: date, time e datetime.
import datetime
date()
datetime.date(year: int, month: int, day: int)
O método date retorna um objeto date com os atributos year, month e day:
from datetime import date
# Criar um objeto date
obj = date(2022, 12, 1)
# Acessar o atributo year
obj.year
2022
obj.month
12
obj.day
1
time()
datetime.time(hour: int, minute: int, second: int)
O método time retorna um objeto time com os atributos hour, minute, second, microsecond e tzinfo:
from datetime import time
# Criar um objeto time
obj = time(10, 20, 33)
# Acessar o atributo hour
obj.hour
10
obj.second
33
obj.microsecond
0
datetime()
datetime.datetime(year, month, day, hour, minute, second)
O datetime retorna um objeto com atributos de objetos date e time:
from datetime import datetime
# Criar um objeto datetime com data e hora
obj = datetime(2024, 12, 1, 15, 35, 59)
# Acessar o atributo year
obj.year
2024
obj.month
12
obj.day
1
obj.hour
15
obj.second
59
now() e today()
Os métodos now e today retornam um objeto datetime com o dia e a hora exatos do sistema:
from datetime import datetime
# Obter data e hora atuais
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 19, 56, 49, 589806)
Como o objeto retornado é um datetime, podemos acessar os atributos date e time:
now.date()
datetime.date(2022, 7, 23)
now.time()
datetime.time(19, 56, 49, 589806)
now.year
2022
now.month
7
now.day
23
now.hour
19
now.minute
56
now.second
49
now.microsecond
589806
Além disso, now pode aceitar um objeto timezone como um parâmetro opcional:
from datetime import datetime, timezone
# Obter a hora UTC atual
datetime.now(timezone.utc)
datetime.datetime(2022, 7, 24, 0, 20, 8, 265634, tzinfo=datetime.timezone.utc)
Se um parâmetro timezone não for especificado, now usará o fuso horário do sistema como padrão.
strftime() e strptime()
Você pode facilmente transformar entre strings e objetos datetime com os métodos strftime e strptime.
strftime()
strftime permite-nos criar strings formatadas de forma legível a partir de um objeto datetime do Python:
from datetime import datetime
# Obter a data e hora atuais para exemplos de formatação
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 20, 31, 19, 751479)
# Formatar datetime como dia-mês-ano com mês abreviado
now.strftime("%d-%b-%Y")
'23-Jul-2022'
# Formatar datetime como dia-mês-ano com mês numérico
now.strftime("%d-%m-%Y")
'23-07-2022'
# Formatar datetime como mês/dia/ano
now.strftime("%m/%d/%Y")
'07/23/2022'
# Formatar datetime com data e hora
now.strftime("%b/%d/%Y - %H:%M:%S")
'Jul/23/2022 - 20:31:19'
Você pode achar as strings passadas para strftime um pouco estranhas, mas é bem fácil entender o seu significado. Por exemplo, %m/%d/%Y retornará o mês, o dia e o ano separados por / (07/23/2022).
strptime()
O método strptime cria um objeto datetime a partir de uma string.
Este método aceita dois parâmetros:
obj.strptime(datetime_string, format)
- Uma string representando um objeto datetime.
- O código de formato python equivalente a essa string.
from datetime import datetime
# Analisar string para objeto datetime
datetime_str = '12-Jul-2023'
datetime.strptime(datetime_str, '%d-%b-%Y')
datetime.datetime(2023, 7, 12, 0, 0)
# Analisar string com data e hora
datetime_str = 'Jul/12/2023 - 14:38:37'
datetime.strptime(datetime_str, "%b/%d/%Y - %H:%M:%S")
datetime.datetime(2023, 7, 12, 14, 38, 37)
Códigos de Formato
| Diretiva | Significado | Exemplo |
|---|---|---|
%a | Dia da semana como nome abreviado da localidade. | Dom, Seg, …, Sáb (pt_BR) |
%A | Dia da semana como nome completo da localidade. | Domingo, Segunda-feira, …, Sábado (pt_BR) |
%w | Dia da semana como um número decimal, onde 0 é Domingo e 6 é Sábado. | 0, 1, …, 6 |
%d | Dia do mês como um número decimal preenchido com zero. | 01, 02, …, 31 |
%b | Mês como nome abreviado da localidade. | Jan, Fev, …, Dez (pt_BR) |
%B | Mês como nome completo da localidade. | Janeiro, Fevereiro, …, Dezembro (pt_BR) |
%m | Mês como um número decimal preenchido com zero. | 01, 02, …, 12 |
%y | Ano sem século como um número decimal preenchido com zero. | 00, 01, …, 99 |
%Y | Ano com século como um número decimal. | 0001, 0002, …, 2013, 2014, …, 9998, 9999 |
%H | Hora (relógio de 24 horas) como um número decimal preenchido com zero. | 00, 01, …, 23 |
%I | Hora (relógio de 12 horas) como um número decimal preenchido com zero. | 01, 02, …, 12 |
%p | Equivalente local de AM ou PM. | AM, PM (en_US) |
%M | Minuto como um número decimal preenchido com zero. | 00, 01, …, 59 |
%S | Segundo como um número decimal preenchido com zero. | 00, 01, …, 59 |
%f | Microssegundo como um número decimal, preenchido à esquerda com zero. | 000000, 000001, …, 999999 |
%z | Deslocamento UTC na forma ±HHMM[SS[.ffffff]] (string vazia se o objeto for ingênuo). | (vazio), +0000, -0400, +1030, +063415, -030712.345216 |
%Z | Nome do fuso horário (string vazia se o objeto for ingênuo). | (vazio), UTC, GMT |
%j | Dia do ano como um número decimal preenchido com zero. | 001, 002, …, 366 |
%U | Número da semana do ano (Domingo como o primeiro dia da semana) como um número decimal preenchido com zero. Todos os dias em um novo ano precedendo o primeiro Domingo são considerados na semana 0. | 00, 01, …, 53 |
%W | Número da semana do ano (Segunda-feira como o primeiro dia da semana) como um número decimal. Todos os dias em um novo ano precedendo a primeira Segunda-feira são considerados na semana 0. | 00, 01, …, 53 |
%c | Representação de data e hora apropriada da localidade. | Ter Ago 16 21:30:00 1988 (en_US) |
%x | Representação de data apropriada da localidade. | 08/16/88 (None) |
%X | Representação de hora apropriada da localidade. | 21:30:00 (en_US) |
%% | Um caractere '%' literal. | % |
timedelta()
O objeto timedelta representa a diferença entre duas datas ou horas.
from datetime import datetime
# Criar dois objetos datetime
date_1 = datetime.strptime('12-Jul-2023', '%d-%b-%Y')
date_2 = datetime.strptime('01-Jan-2024', '%d-%b-%Y')
# Calcular a diferença (retorna timedelta)
difference = date_2 - date_1
difference
datetime.timedelta(days=173)
# Obter o número de dias do timedelta
difference.days
173
timedelta pode adicionar days, seconds e microseconds a um objeto datetime:
from datetime import datetime, timedelta
# Obter a data e hora atuais para exemplos de timedelta
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# Adicionar 10 dias e 15 segundos à data e hora atuais
now + timedelta(days=10, seconds=15)
datetime.datetime(2022, 8, 2, 21, 25, 17, 341081)
E pode subtrair days, seconds e microseconds de um objeto datetime:
from datetime import datetime, timedelta
# Obter a data e hora atuais para exemplo de subtração
now = datetime.now()
now
datetime.datetime(2022, 7, 23, 21, 25, 2, 341081)
# Subtrair 10 dias e 15 segundos da data e hora atuais
now - timedelta(days=10, seconds=15)
datetime.datetime(2022, 7, 13, 21, 59, 41, 100883)