Comando date - Formatação e Cálculo de Datas
O que você vai conseguir fazer
- Formatar datas e horas como quiser com `date +FORMATO`
- Calcular datas como ontem ou N dias depois com `date -d`
- Converter entre segundos epoch e datas com `date +%s` e `date -d @segundos`
Pré-requisitos (leia estes primeiro)
O Que é o Comando date?
date serve. Digite-o e ele imprime a hora atual.date +%Y%m%d e ele formata isso como 20260605. Dá para usar o resultado direto em um nome de arquivo.O comando date mostra a data e a hora atuais. Ele também formata essa saída como você quiser.
Você vai usá-lo para marcar a hora em logs, nomear arquivos de backup e calcular datas dentro de scripts. Ele aparece quase todo dia.
As palavras usadas aqui (para não confundir depois)
- Formato: como a data deve ser impressa. "Layout" quer dizer o mesmo aqui.
- Especificador de formato: um símbolo que começa com
%, como%Y. Cada um representa uma parte da data. - Locale: as configurações de idioma e região. Nomes de dias da semana mudam com ela.
- Fuso horário: a diferença de hora de cada região. O Japão usa JST e a referência mundial é o UTC.
- Segundos epoch: a quantidade de segundos desde 1 de janeiro de 1970. "Unix time" quer dizer o mesmo.
Ambiente
- SO: Ubuntu / Linux típico
- GNU coreutils
date(a versão BSD do macOS usa outra sintaxe, veja a seção 7) - As saídas deste artigo aparecem no horário do Japão (JST). Em máquinas com outro fuso, os horários mudam
Em uma linha
date +FORMAT constrói uma string de data no formato que você quiser.
Exemplo: date +%Y-%m-%d → 2026-06-05
O Que Você Vai Aprender
- Mostrar a hora atual com
datee formatar comdate +%Fe parecidos - Combinar especificadores de formato como
%Y,%me%dem qualquer layout - Calcular datas como ontem, N dias depois ou próxima semana com
date -d - Obter segundos epoch com
date +%se converter de volta comdate -d @segundos - Trocar fusos horários com
TZ='UTC' dateoudate -u - Ficar atento às diferenças entre Linux (GNU date) e macOS (BSD date)
1. Mostrar a Hora Atual
Conclusão: Execute date sem argumentos para a hora atual; use date +FORMAT para mudar a aparência.
Sem nenhuma opção, o date imprime a data e a hora atuais.
$ date
Fri Jun 5 15:52:59 JST 2026
O texto exato depende das configurações de locale e de fuso horário do seu sistema. O dia da semana e a parte JST são os trechos que mudam.
Quando você quer apenas a data, ou apenas a hora, use os especificadores de formato na próxima seção.
2. Formatar a Saída (%Y %m %d...)
Conclusão: Coloque especificadores como %Y (ano), %m (mês), %d (dia) após date + para moldar a saída.
Escreva especificadores de formato depois do +. Você recebe exatamente aquele formato.
$ date +%Y-%m-%d
2026-06-05
$ date "+%Y/%m/%d %H:%M:%S"
2026/06/05 15:52:59
Se o seu formato tiver um espaço, envolva tudo com "..." (aspasEnvolver um texto entre aspas (' ou ") para que seja tratado como um único valor, por exemplo um que tenha espaços. duplas).
Sem as aspas, o shellUm programa interativo que interpreta os comandos digitados e os executa. divide o formato no espaço. O date então trata a segunda metade como um argumento a mais e para com erro.
$ date +%Y-%m-%d %H:%M:%S
date: extra operand '%H:%M:%S' Try 'date --help' for more information.
2-1. Especificadores de Formato Comuns
| Especificador | Significado | Exemplo |
|---|---|---|
%Y |
Ano com 4 dígitos | 2026 |
%m |
Mês (01-12) | 06 |
%d |
Dia (01-31) | 05 |
%H |
Hora (00-23) | 15 |
%M |
Minuto (00-59) | 52 |
%S |
Segundo (00-60) | 59 |
%A |
Dia da semana (completo) | Friday |
%a |
Dia da semana (curto) | Fri |
%j |
Dia do ano | 156 |
%s |
Segundos epoch | 1780642379 |
2-2. Atalhos Úteis
$ date +%F
2026-06-05
$ date +%T
15:52:59
%Fequivale a%Y-%m-%d(a data ISO 8601)%Tequivale a%H:%M:%S(a hora)
Na dúvida, lembre do %F para a data e do %T para a hora. Esses dois cobrem quase todas as situações.
2-3. Lina Tropeça: Trocar %m por %M
52. Esse mês não existe.$ date +%Y-%M-%d
2026-52-05
%M maiúsculo.%m minúsculo é o mês e o %M maiúsculo é o minuto. Agora são 15:52, então o 52 caiu no lugar do mês.%Y do ano é a exceção.%m (mês) e %M (minuto) são fáceis de trocar, e o mesmo vale para %d (dia) e %D (mês/dia/ano). O erro não gera mensagem nenhuma. Ele imprime um número que parece certo, e por isso conferir a saída importa.
3. Templates para Nomes de Arquivo e Logs
Conclusão: Incorpore $(date +%Y%m%d) em um nome de arquivo para criar arquivos datados automaticamente.
$(...) insere a saída de um comando dentro de um texto. Isso se chama substituição de comando, e é o truque clássico para backups.
$ cp data.db "backup-$(date +%Y%m%d).db"
Isso cria um arquivo chamado backup-20260605.db.
$ echo "[$(date '+%Y-%m-%d %H:%M:%S')] Processo iniciado" >> app.log
Use isso quando quiser adicionar seu próprio timestamp a um log. Exemplo de saída:
[2026-06-05 15:52:59] Processo iniciado
Evite colocar %T direto em nomes de arquivo. O %T contém dois-pontos (:), e alguns ambientes e sistemas de arquivos lidam mal com isso.
Para colocar a hora em um nome, use %H%M%S, sem separadores.
4. Calcular Datas (ontem, 3 dias depois, N dias atrás)
Conclusão: Use date -d "string" para calcular datas como yesterday, 3 days ago ou next friday em inglês simples.
Passe a data que você quer para a opção -d (ou --date), escrita em inglês simples.
$ date -d "yesterday" +%F
2026-06-04
$ date -d "3 days ago" +%F
2026-06-02
$ date -d "next friday" +%F
2026-06-12
Você também pode calcular a partir de uma data base escolhida por você.
$ date -d "2025-01-01 +30 days" +%F
2025-01-31
date acerta essa parte. Ele sabe quantos dias tem cada mês e lida com anos bissextos.Expressões comuns
tomorrow/yesterday3 days ago/2 weeks/1 monthnext monday/last sunday
Este cálculo de data relativa é um recurso do GNU date (Linux). O macOS usa uma sintaxe diferente, então esses comandos não funcionam lá. Veja a Seção 7 para detalhes.
5. Segundos Epoch (Unix Time)
Conclusão: date +%s imprime segundos desde 1970, e date -d @seconds converte de volta para uma data.
Segundos epoch (Unix time) é a quantidade de segundos desde 1970-01-01 00:00:00 UTC.
Programas e logs costumam guardar a hora nesse formato. Ele não depende de região nem de formatação, o que facilita a comparação.
$ date +%s
1780642379
Para converter segundos epoch de volta em uma data legível, coloque @ antes do número.
$ date -u -d @1700000000 "+%Y-%m-%d %H:%M:%S %Z"
2023-11-14 22:13:20 UTC
O -u é o que fixa essa saída em UTC. Sem ele, o resultado segue o fuso horário da sua máquina.
No horário do Japão (JST, UTC+9) o mesmo comando imprime 2023-11-15 07:13:20, ou seja, o dia seguinte. Máquinas em outro fuso mostram outra data, então use -u ou TZ quando precisar de uma resposta fixa.
Às vezes um log registra apenas um número como 1700000000, que você não consegue ler assim. O date -d @esse-numero converte para uma data na hora.
6. Trocar Fusos Horários (TZ / -u)
Conclusão: date -u mostra UTC, e TZ='Área/Cidade' date mostra a hora em qualquer fuso horário.
Adicione -u para exibir a hora em UTC (Tempo Universal Coordenado).
$ date -u "+%Y-%m-%d %H:%M %Z"
2026-06-05 06:52 UTC
Para ver a hora em uma região específica, defina a variável de ambienteUm valor nomeado que o shell ou um programa pode consultar durante a execução. TZ logo antes do comando.
$ TZ='America/New_York' date "+%Y-%m-%d %H:%M %Z"
2026-06-05 02:52 EDT
$ TZ='Asia/Tokyo' date "+%Y-%m-%d %H:%M %Z"
2026-06-05 15:52 JST
TZ=... antes do comando muda o fuso horário apenas para aquela execução?TZ='Area/Cidade' date só vale enquanto aquele date executa.Você pode listar os nomes de fuso válidos com timedatectl list-timezones. Asia/Tokyo, America/New_York e Europe/London são exemplos.
O TZ é uma variável de ambiente, então ler Trabalhando com Variáveis de Ambiente vai aprofundar o seu entendimento.
7. Atenção à Diferença com macOS (BSD date)
Conclusão: Linux vem com GNU date; macOS vem com BSD date, cujo cálculo de data e sintaxe de epoch diferem.
Os comandos deste artigo assumem Linux como o Ubuntu (GNU coreutils date).
O date que vem com o macOS é a versão BSD, então algumas opções são diferentes.
| O que você quer | Linux (GNU) | macOS (BSD) |
|---|---|---|
| 3 dias atrás | date -d "3 days ago" |
date -v-3d |
| Epoch para data | date -d @1700000000 |
date -r 1700000000 |
| Interpretar string data | date -d "2025-01-01" |
date -j -f "%Y-%m-%d" "2025-01-01" |
Um comando date -d ... achado na internet pode reclamar com algo como illegal option no macOS. Nesse caso, você está quase certamente na versão BSD.
Execute date --version. Se aparecer GNU coreutils, você está na versão GNU.
8. Mini Exercícios: Tente Você Mesmo
Conclusão: Três exercícios -- montar um formato, calcular uma data e converter segundos epoch -- confirmam o básico do
datena prática.
Tarefa 1: Imprima a data de hoje no formato 2026/06/05, com barras.
Ver dica 1 (direcionamento)
Depois do +, enfileire os símbolos de ano, mês e dia, ligados por barras. Não há espaço nenhum envolvido.
Ver dica 2 (nome do comando)
O comando é o date. Os símbolos de ano, mês e dia estão na tabela da seção 2. Repare que o mês é minúsculo.
Ver a resposta
$ date +%Y/%m/%d
2026/06/05
Tarefa 2: Imprima a data de 3 dias a partir de hoje no formato AAAA/MM/DD.
Ver dica 1 (direcionamento)
São duas coisas ao mesmo tempo. Você precisa da opção que calcula a data e também do formato que a molda.
Ver dica 2 (nome do comando)
O comando é o date. A opção que calcula uma data está na seção 4, e a sintaxe de formato está na seção 2.
Ver a resposta
$ date -d "3 days" "+%Y/%m/%d"
2026/06/08
"3 days" significa "3 dias a partir de agora". Escrever "+3 days" dá o mesmo resultado.
Tarefa 3: Converta os segundos epoch 1700000000 de volta em uma data no formato AAAA-MM-DD, em UTC.
Ver dica 1 (direcionamento)
Um número solto não é lido como data. Coloque uma marca na frente dele para dizer que são segundos epoch. Some a opção que muda a saída para UTC.
Ver dica 2 (nome do comando)
O comando é o date. A marca para segundos epoch está na seção 5, e a opção que muda para UTC está na seção 6.
Ver a resposta
$ date -u -d @1700000000 +%F
2023-11-14
%F quer dizer o mesmo que %Y-%m-%d. Sem o -u, a resposta segue o seu fuso local e pode cair no dia seguinte.
9. Revisão
date +FORMATO decide o formato e o date -d calcula a data.%m é o mês e %M é o minuto. Vou sempre conferir isso na tela.@ ao converter segundos epoch de volta.Resumo de Hoje em 3 Linhas
date +%Fdá a data edate +%Tdá a hora. Na dúvida, use esses dois%mé o mês e%Mé o minuto. A troca não gera erro, então confira a saídadate -d "3 days ago"calcula datas edate -d @segundosvolta de epoch para data
Resumo
| Tarefa | Comando |
|---|---|
| Mostrar a hora atual | date |
| Mostrar apenas a data | date +%F (= date +%Y-%m-%d) |
| Mostrar apenas a hora | date +%T |
| Data para nome de arquivo | date +%Y%m%d |
| Calcular uma data | date -d "3 days ago" +%F |
| Obter segundos epoch | date +%s |
| Converter epoch para data | date -d @1700000000 |
| Mostrar UTC | date -u |
| Usar um fuso horário específico | TZ='Asia/Tokyo' date |
Três coisas para tentar agora
- Execute
date +%Fpara mostrar a data de hoje - Execute
date -d "tomorrow" +%Fpara calcular amanhã - Execute
cp algo.txt "backup-$(date +%Y%m%d).txt"para criar um arquivo datado