Comando date - Formatação e Cálculo de Datas

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?

Lina: Linny-senpai, eu quero colocar a data de hoje nos nomes dos meus arquivos de backup. Eu realmente tenho que digitar na mão toda vez?
Veterano Linny: É exatamente para isso que o comando date serve. Digite-o e ele imprime a hora atual.
Veterano Linny: Escreva date +%Y%m%d e ele formata isso como 20260605. Dá para usar o resultado direto em um nome de arquivo.
Lina: Então um único comando já monta a data para mim.
Veterano Linny: Sim. Ele também calcula "3 dias atrás" ou "próxima sexta-feira". Trocar de fuso horário funciona do mesmo jeito.

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-%d2026-06-05

O Que Você Vai Aprender

  • Mostrar a hora atual com date e formatar com date +%F e parecidos
  • Combinar especificadores de formato como %Y, %m e %d em qualquer layout
  • Calcular datas como ontem, N dias depois ou próxima semana com date -d
  • Obter segundos epoch com date +%s e converter de volta com date -d @segundos
  • Trocar fusos horários com TZ='UTC' date ou date -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
Lina: São muitos especificadores. Nunca vou lembrar de todos.
Veterano Linny: Você não precisa. As combinações mais comuns têm atalhos.

2-2. Atalhos Úteis

$ date +%F
2026-06-05
$ date +%T
15:52:59
  • %F equivale a %Y-%m-%d (a data ISO 8601)
  • %T equivale 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

Lina: Senpai, pedi ano-mês-dia e o mês saiu como 52. Esse mês não existe.
$ date +%Y-%M-%d
2026-52-05
Lina: Será que eu quebrei a data?
Veterano Linny: Nada quebrou. Olhe com atenção: você escreveu %M maiúsculo.
Veterano Linny: O %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.
Lina: Espera, maiúscula e minúscula querem dizer coisas diferentes? Isso me pegou de surpresa.
Veterano Linny: Querem sim. Datas usam minúsculas e horas usam maiúsculas. O %Y do ano é a exceção.
Lina: Como saiu um número, eu nem percebi. Não dar erro deixa isso mais perigoso.
Veterano Linny: Exato. Então, sempre que mudar um formato, imprima uma vez e olhe o resultado. Esse é o jeito mais seguro de perceber.

%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
Lina: Sempre que conto 30 dias à frente na mão, erro na virada do mês.
Veterano Linny: Exato, e o date acerta essa parte. Ele sabe quantos dias tem cada mês e lida com anos bissextos.
Veterano Linny: Isso o torna bem mais seguro do que contar de cabeça.

Expressões comuns

  • tomorrow / yesterday
  • 3 days ago / 2 weeks / 1 month
  • next 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
Lina: Então escrever TZ=... antes do comando muda o fuso horário apenas para aquela execução?
Veterano Linny: Exatamente. TZ='Area/Cidade' date só vale enquanto aquele date executa.
Veterano Linny: A configuração do sistema continua intocada, então dá para experimentar sem medo.
Lina: Isso é útil para conferir a hora em um servidor no exterior.

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 date na prática.

Lina: Peguei a teoria. Quero confirmar na prática.
Veterano Linny: Ótimo. Aqui vão três tarefas. Tente no seu terminal.

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

Lina: Vou resumir. O date +FORMATO decide o formato e o date -d calcula a data.
Veterano Linny: Exato. Dá para usar os dois juntos, então uma data calculada sai no formato que você quiser.
Lina: No formato, %m é o mês e %M é o minuto. Vou sempre conferir isso na tela.
Veterano Linny: Perfeito. E não esqueça do @ ao converter segundos epoch de volta.

Resumo de Hoje em 3 Linhas

  1. date +%F dá a data e date +%T dá a hora. Na dúvida, use esses dois
  2. %m é o mês e %M é o minuto. A troca não gera erro, então confira a saída
  3. date -d "3 days ago" calcula datas e date -d @segundos volta 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

  1. Execute date +%F para mostrar a data de hoje
  2. Execute date -d "tomorrow" +%F para calcular amanhã
  3. Execute cp algo.txt "backup-$(date +%Y%m%d).txt" para criar um arquivo datado

Próximas Leituras