Comando date - Formatacao e Calculo de Datas

Comando date - Formatacao e Calculo de Datas

O Que e 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 mao toda vez?
Veterano Linny: E exatamente para isso que o comando date serve. Execute-o e ele imprime a hora atual, e date +%Y%m%d formata como 20260605. Voce pode usar isso diretamente em um nome de arquivo.
Lina: Espera, um unico comando pode construir uma string de data para mim?
Veterano Linny: Sim. E ele pode fazer mais — calcular "3 dias atras" ou "proxima sexta-feira," e trocar entre fusos horarios. Vamos percorrer o basico hoje.

O comando date exibe a data e hora atuais, e formata como voce quiser. Timestamps em logs, nomes de arquivos de backup, calculos de data dentro de scripts — e um comando que voce vai usar quase todo dia.

Em uma linha

date +FORMAT constroi uma string de data no formato que voce quiser.

Exemplo: date +%Y-%m-%d2026-06-05

O Que Voce Vai Aprender

  • Mostrar a hora atual com date, e formatar com date +%F e similares
  • Combinar especificadores de formato como %Y %m %d em qualquer layout
  • Calcular datas como ontem, N dias depois, proxima semana com date -d
  • Obter segundos epoch (Unix time) com date +%s e converter de volta com date -d @seconds
  • Trocar fusos horarios com TZ='UTC' date ou date -u
  • Ficar atento as diferencas de sintaxe entre Linux (GNU date) e macOS (BSD date)

1. Mostrar a Hora Atual

Conclusao: Execute date sem argumentos para a hora atual; use date +FORMAT para mudar a aparencia.

Sem argumentos, date imprime a data e hora atuais.

$ date
Fri Jun  5 15:52:59 JST 2026

O texto exato (o dia da semana e a parte JST) depende das configuracoes de locale e fuso horario do seu sistema.

Quando voce quer apenas a data, ou apenas a hora, use os especificadores de formato na proxima secao.

2. Formatar a Saida (%Y %m %d...)

Conclusao: Coloque especificadores como %Y (ano), %m (mes), %d (dia) apos date + para moldar a saida.

Escreva especificadores de formato apos o + e voce obtem exatamente aquele formato.

$ date +%Y-%m-%d
2026-06-05
$ date "+%Y/%m/%d %H:%M:%S"
2026/06/05 15:52:59

Se seu formato contiver um espaco, envolva tudo com "..." (aspas duplas). Sem aspas, o shell divide no espaco e voce recebe um erro ou saida inesperada.

2-1. Especificadores de Formato Comuns

Especificador Significado Exemplo
%Y Ano com 4 digitos 2026
%m Mes (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: Sao muitos especificadores. Eu nunca vou lembrar de todos...
Veterano Linny: Voce nao precisa. As combinacoes mais comuns tem atalhos.

2-2. Atalhos Uteis

$ 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 duvida, lembre de %F (data) e %T (hora) — eles cobrem a maioria das situacoes.

3. Templates para Nomes de Arquivo e Logs

Conclusao: Incorpore $(date +%Y%m%d) em um nome de arquivo para criar arquivos datados automaticamente.

$(...) insere a saida de um comando em uma string (substituicao de comando). E o truque classico 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 proprio timestamp a um log. Exemplo de saida:

[2026-06-05 15:52:59] Processo iniciado

Evite colocar %T diretamente em nomes de arquivo, pois contem : (dois-pontos). Alguns ambientes e sistemas de arquivos lidam mal com isso. Para timestamp em um nome, %H%M%S (sem separadores) e mais seguro.

4. Calcular Datas (ontem, 3 dias depois, N dias atras)

Conclusao: Use date -d "string" para calcular datas como yesterday, 3 days ago ou next friday em ingles simples.

Passe a data que voce quer para a opcao -d (ou --date), escrita em ingles 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

Voce tambem pode calcular a partir de uma data base.

$ date -d "2025-01-01 +30 days" +%F
2025-01-31
Lina: Sempre que eu conto "30 dias a partir de agora" na mao, eu sempre erro na virada do mes...
Veterano Linny: Exato, e o date faz isso corretamente para voce. Ele lida com finais de mes e anos bissextos tambem, entao e muito mais seguro do que contar de cabeca.

Expressoes comuns

  • tomorrow / yesterday
  • 3 days ago / 2 weeks / 1 month
  • next monday / last sunday

Este calculo de data relativa e um recurso do GNU date (Linux). O macOS usa uma sintaxe diferente e esses comandos nao funcionarao la. Veja a Secao 7 para detalhes.

5. Segundos Epoch (Unix Time)

Conclusao: date +%s imprime segundos desde 1970, e date -d @seconds converte de volta para uma data.

Segundos epoch (Unix time) e o numero de segundos desde 1970-01-01 00:00:00 UTC. E um formato comum para armazenar tempo em programas e logs.

$ date +%s
1780642379

Para converter segundos epoch de volta para uma data legivel, prefixe o numero com @.

$ date -u -d @1700000000 "+%Y-%m-%d %H:%M:%S %Z"
2023-11-14 22:13:20 UTC

Quando um log registra apenas um numero como 1700000000 e voce nao consegue ler, date -d @esse-numero converte para uma data instantaneamente.

6. Trocar Fusos Horarios (TZ / -u)

Conclusao: date -u mostra UTC, e TZ='Area/Cidade' date mostra a hora em qualquer fuso horario.

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 regiao especifica, defina a variavel de ambiente 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: Entao escrever TZ=... antes do comando muda o fuso horario apenas para aquela execucao?
Veterano Linny: Exatamente. TZ='Area/Cidade' date so se aplica enquanto aquele date executa. Sua configuracao do sistema permanece intocada, entao e seguro experimentar.
Lina: Isso e util para verificar a hora em um servidor no exterior!

Voce pode listar os nomes de fuso validos (como Asia/Tokyo, America/New_York, Europe/London) com timedatectl list-timezones. Como TZ e uma variavel de ambiente, ler Trabalhando com Variaveis de Ambiente vai aprofundar seu entendimento.

7. Atencao a Diferenca com macOS (BSD date)

Conclusao: Linux vem com GNU date; macOS vem com BSD date, cujo calculo de data e sintaxe de epoch diferem.

Os comandos neste artigo assumem Linux como Ubuntu (GNU coreutils date). O date que vem com macOS e a versao BSD, e algumas opcoes diferem.

O que voce quer Linux (GNU) macOS (BSD)
3 dias atras 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"

Se um comando date -d ... que voce encontrou online reclama com algo como illegal option no macOS, voce provavelmente esta na versao BSD. Execute date --version; se imprimir GNU coreutils, voce esta na versao GNU.

Mini desafio: mostrar a data 3 dias a partir de agora no formato AAAA/MM/DD

Dica: calcule a data com -d, depois formate com +FORMAT.

Resposta:

$ date -d "3 days" "+%Y/%m/%d"
2026/06/08

"3 days" significa "3 dias a partir de agora." Escrever "+3 days" faz a mesma coisa.

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 horario especifico TZ='Asia/Tokyo' date

Tres coisas para tentar agora

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

Proximas Leituras