você está aqui: Home  → Arquivo de Mensagens

Date - Passeando no tempo

Colaboração: Fabiano Caixeta Duarte

Data de Publicação: 19 de Outubro de 2005

Ao escrever scripts para tratar logs ou fazer estatísticas, é comum termos que lidar com datas em diversos formatos. Ocorre que nem sempre a data se encontra no formato desejado. Para isto, podemos nos valer de um utilitário chamado date.

O comando date tem como funções principais exibir e alterar a data do sistema. Mas com ele podemos fazer mais do que isto: podemos converter o formato de exibição da data atual ou de uma data qualquer especificada.

Entretanto, este utilitário tem diferentes versões, escritas por autores diferentes. O Linux adotou a versão escrita por David Mackenzie e o FreeBSD utiliza uma versão originária do Unix da AT&T. As diferentes versões possuem sintaxes divergentes. Vamos aqui abordar ambas.

Nem tudo é diferente :)

A simples execução do comando date, retorna a data atual no seguinte formato:

  $ date
  Sat Sep 17 18:00:00 BRT 2005

Uma vez que ambos os fontes do comando date utilizam a função strftime (time.h), os caracteres utilizados para formatação da data são os mesmos.

Veja alguns exemplos:

  • %d - Dia
  • %m - Mês em representação numérica
  • %Y - Ano representado em quatro dígitos
  • %F - Equivalente a %Y-%m-%d (formato frequentemente utilizado para inserção em bancos de dados)
  • %A - Dia da semana por extenso

O sinal de + indica que utilizaremos os caracteres de formatação. Para exibirmos o dia da semana, por extenso, da data atual, façamos:

  $ date +%A
  Saturday

Importante ressaltar que o comando date respeita a variável de ambiente LANG. Isto significa dizer que:

  $ echo $LANG
  en_US.iso8859-1
  $ date +%A
  Saturday
  $ LANG=pt_BR.iso8859-1
  $ date +%A
  sábado

Passeando no tempo

Podemos precisar de provocar um deslocamento para o passado ou futuro na data a ser formatada.

No linux

Para informar ao comando date o deslocamento de uma data, utilzamos o parâmetro -d ou --date. Podemos especificar o desloca mento em dias(day), semanas(week), meses(month) ou anos(year).

Seguem alguns exemplos:

  $ date -d "1 month"
  Mon Oct 17 18:00:00 BRT 2005
  $ date -d "2 week"
  Sat Oct  1 18:00:00 BRT 2005

Para "voltarmos no tempo" utilizamos a variante 'ago'.

  $ date -d "3 year ago"
  Tue Sep 17 18:00:00 BRT 2002

No FreeBSD

O deslocamento é feito a partir do parâmetro -v, com a seguinte sintaxe:

[sinal][número][unidade_de_tempo]

  • O sinal indica se o deslocamento é negativo (passado) ou positivo (futuro)
  • O número indica a quantidade de unidades de tempo a serem deslocadas
  • A unidade de tempo é indicada por um dos caracteres (y, m, w, d, H, M, S), ou seja, (ano, mês, semana, dia, hora, minuto, segundo)

Os mesmos exemplos, conforme a sintaxe a ser utilizada no FreeBSD:

  $ date -v+1m
  Mon Oct 17 18:00:00 BRT 2005
  $ date -v+2w
  Sat Oct  1 18:00:00 BRT 2005
  $ date -v-3y
  Tue Sep 17 18:00:00 BRT 2002

Datas específicas

Nos casos em que vamos tratar informações oriundas de logs, as datas podem não estar no formato necessário ao nosso propósito.

Vamos supor que iremos alimentar um banco de dados com as informações contidas em um log com o seguinte formato:

  Sep 17 18:26:14 servidor sm-mta[87357]: j8HMQ9tJ087356: stat=Sent

Precisamos desta data no formato 2005-09-17.

No Linux

Novamente o parâmetro -d nos será útil, mas de uma maneira diferente. Desta vez, passaremos a data extraída do log da seguinte maneira:

  date -d "Sep 17" +%F

Observe alguns exemplos dos formatos aceitos:

  • "17 Sep"
  • "Sep 17"
  • "17 September"
  • "17 Sep 2005"

Importante ressaltar que os espaços em branco podem ser substituídos por um '-' ou até serem suprimidos. Outros caracteres não podem ser utilizados como separadores.

No FreeBSD

Aqui vemos uma maior versatilidade no padrão de entrada, com o uso de um parâmetro com dois argumentos, para determinar a data a ser formatada.

O parâmetro -f aceita como argumentos o formato de entrada e a data alvo. No caso apresentado no nosso log, o comando ficaria assim:

  date -f "%b %d" "Sep 25" +%F

Assim, podemos usar qualquer formato de entrada para a conversão, basta que o especifiquemos corretamente.

O log de acesso do squid (ferramenta de proxy e cache), por exemplo, contém as datas em timestamps (segundos desde 01/01/1970). O comando a seguir converte este timestamp para algo humanamente compreensível:

  $ date -f %s 1126992004 +%d/%m/%Y
  17/09/2005

Referências



 

 

Veja a relação completa dos artigos de Fabiano Caixeta Duarte

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script