Como Fazer Cálculos e Formatação de Data no Linux

Aprenda a como fazer calculos para dias passados e futuros usando o comando date do Linux.
Aprenda também a como fazer para formatar a data para ser exibida em seus scripts baseados em shell.

Formatando a data

Por padrão quando você executa o comando date no linux terá o seguinte resultado.

# date
Fri Apr 29 21:17:46 BRT 2011

Porém muitas vezes esse formato não é o mais adequado para um shell script, sendo assim você pode personalizar a forma como a data será exibida, vamos a alguns exemplos:

# date "+Data: %d/%m/%Y%nHora: %H:%M:%S"
Data: 29/04/2011
Hora: 21:18:34

# date "+Data: %d/%m/%Y%tHora: %H:%M:%S"
Data: 29/04/2011        Hora: 21:19:03

# date "+%t##### Data: %d/%m/%Y%t ##### %tHora: %H:%M:%S #####"
        ##### Data: 29/04/2011   #####  Hora: 21:20:15 #####

Você deve usar o comanda date com o sinal de +.

date [+FORMAT]

Abaixo você verá a lista de todas as opções de formatação, mais informações podem ser obtidas usando o man do programa date.

       %%     a literal %
       %a     locale's abbreviated weekday name (e.g., Sun)
       %A     locale's full weekday name (e.g., Sunday)
       %b     locale's abbreviated month name (e.g., Jan)
       %B     locale's full month name (e.g., January)
       %c     locale's date and time (e.g., Thu Mar  3 23:05:25 2005)
       %C     century; like %Y, except omit last two digits (e.g., 21)
       %d     day of month (e.g, 01)
       %D     date; same as %m/%d/%y
       %e     day of month, space padded; same as %_d
       %F     full date; same as %Y-%m-%d
       %g     last two digits of year of ISO week number (see %G)
       %G     year of ISO week number (see %V); normally useful only with %V
       %h     same as %b
       %H     hour (00..23)
       %I     hour (01..12)
       %j     day of year (001..366)
       %k     hour ( 0..23)
       %l     hour ( 1..12)
       %m     month (01..12)
       %M     minute (00..59)
       %n     a newline
       %N     nanoseconds (000000000..999999999)
       %p     localeâs equivalent of either AM or PM; blank if not known
       %P     like %p, but lower case
       %r     localeâs 12-hour clock time (e.g., 11:11:04 PM)
       %R     24-hour hour and minute; same as %H:%M
       %s     seconds since 1970-01-01 00:00:00 UTC
       %S     second (00..60)
       %t     a tab
       %T     time; same as %H:%M:%S
       %u     day of week (1..7); 1 is Monday
       %U     week number of year, with Sunday as first day of week (00..53)
       %V     ISO week number, with Monday as first day of week (01..53)
       %w     day of week (0..6); 0 is Sunday
       %W     week number of year, with Monday as first day of week (00..53)
       %x     localeâs date representation (e.g., 12/31/99)
       %X     localeâs time representation (e.g., 23:13:48)
       %y     last two digits of year (00..99)
       %Y     year
       %z     +hhmm numeric timezone (e.g., -0400)
       %:z    +hh:mm numeric timezone (e.g., -04:00)
       %::z   +hh:mm:ss numeric time zone (e.g., -04:00:00)
       %:::z  numeric time zone with : to necessary precision (e.g., -04, +05:30)
       %Z     alphabetic time zone abbreviation (e.g., EDT)

       By default, date pads numeric fields with zeroes.  The following optional flags may follow '%':
       -      (hyphen) do not pad the field
       _      (underscore) pad with spaces
       0      (zero) pad with zeros
       ^      use upper case if possible
       #      use opposite case if possible

Cálculos com a data no Linux

Datas do passado

Aqui vamos mostrar como fazer o calculo para achar um data no passado, podemos subtrair o dia, o mês ou o ano.

# date --date='1 day ago'
Thu Apr 28 21:23:52 BRT 2011

# date --date='1 month ago'
Tue Mar 29 21:24:19 BRT 2011

# date --date='1 year ago'
Thu Apr 29 21:24:37 BRT 2010

Data futura

Da mesma forma podemos fazer cálculos para datas futuras.

# date --date='1 day'
Sat Apr 30 21:25:47 BRT 2011

# date --date='1 month'
Sun May 29 21:26:04 BRT 2011

# date --date='1 year'
Sun Apr 29 21:26:16 BRT 2012

Misturando tudo

Que tal exibir a data futura de uma forma personalizada, basta misturar as duas opções conforme exemplo abaixo.

# date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date='1 month'
Data: 29/05/2011        Hora: 21:27:10

Somando o ano, mês e dia ao mesmo tempo.

# date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date='2 year 3 month 10 day'
Data: 08/08/2013        Hora: 21:38:06

Podemos usar as seguintes opções para calcular uma data

X year
X month
X day
X hours
X minutes
X seconds

Aqui estão todas as opções ativas.

# date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date='2 year 3 month 10 day 4 hours 45 minutes 30 seconds'
Data: 03/09/2013        Hora: 17:10:55

Quando usamos mais de uma opção para fazer o calculo com data no passado devemos usar ago em todos, veja abaixo.

X year ago
X month ago
X day ago
X hours ago
X minutes ago
X seconds ago
# date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date='2 year ago 3 month ago 10 day ago 4 hours ago 45 minutes ago 30 seconds ago'
Data: 14/02/2009        Hora: 08:41:31

Usando na pratica

Você pode utilizar para verificar a aderência da sua maquina ao horário de verão, veja como.

# for m in `seq 1 12`; do date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date="$m month"; done
Data: 29/05/2011        Hora: 21:32:04
Data: 29/06/2011        Hora: 21:32:04
Data: 29/07/2011        Hora: 21:32:04
Data: 29/08/2011        Hora: 21:32:04
Data: 29/09/2011        Hora: 21:32:04
Data: 29/10/2011        Hora: 22:32:04
Data: 29/11/2011        Hora: 22:32:04
Data: 29/12/2011        Hora: 22:32:04
Data: 29/01/2012        Hora: 22:32:04
Data: 29/02/2012        Hora: 21:32:04
Data: 29/03/2012        Hora: 21:32:04
Data: 29/04/2012        Hora: 21:32:04

Veja que nos meses outubro, novembro, dezembro e janeiro o horário está adiantado, isso é porque nesses meses no timezone que o meu Linux está configurado tem horário de verão, sendo assim ele adianta automaticamente o relógio.

Podemos brincar um pouco e colocar para ele fazer dia a dia e você vai saber exatamente o dia que ele mudar para o horário de verão, veja:

# for m in `seq 1 12`; do for d in `seq 1 31`; do date "+Data: %d/%m/%Y%tHora: %H:%M:%S" --date="$m month $d day"; done; done | less
Data: 30/05/2011        Hora: 21:40:35
Data: 31/05/2011        Hora: 21:40:35
Data: 01/06/2011        Hora: 21:40:35
Data: 02/06/2011        Hora: 21:40:35
Data: 03/06/2011        Hora: 21:40:35
Data: 04/06/2011        Hora: 21:40:35
......
Data: 13/10/2011        Hora: 21:40:35
Data: 14/10/2011        Hora: 21:40:35
Data: 15/10/2011        Hora: 21:40:35
Data: 16/10/2011        Hora: 22:40:35
Data: 17/10/2011        Hora: 22:40:35
Data: 18/10/2011        Hora: 22:40:35
Data: 19/10/2011        Hora: 22:40:35
........
Data: 23/02/2012        Hora: 22:40:35
Data: 24/02/2012        Hora: 22:40:35
Data: 25/02/2012        Hora: 22:40:35
Data: 26/02/2012        Hora: 21:40:35
Data: 27/02/2012        Hora: 21:40:35
.......
Data: 27/05/2012        Hora: 21:40:36
Data: 28/05/2012        Hora: 21:40:36
Data: 29/05/2012        Hora: 21:40:36
Data: 30/05/2012        Hora: 21:40:36

Utilização prática dos scripts acima?

Não muita, apenas para validar se seu Linux está configurado de forma correta para o horário de verão.

Já o script abaixo pode ser utilizado para ler a data informada pelo usuário, a quantidade de dias a serem adicionados ou reduzidos e exibir o resultado para o usuário.

#!/bin/sh

clear
echo Informe uma data. Ex. 31/01/2013
read _DATA
echo

echo Informe o horario. Ex. 15:25:30
read _HORA
echo

_dia=`echo $_DATA | cut -d'/' -f1`
_mes=`echo $_DATA | cut -d'/' -f2`
_ano=`echo $_DATA | cut -d'/' -f3`

echo "Informe quantos DIAS para adicionar (+20) ou reduzir (-25)"
read _NOVA_DATA
echo

if [ $_NOVA_DATA -lt 0 ]; then
        _NOVA_DATA=`echo $_NOVA_DATA | tr "-" " "`
        date --date="$_ano-$_mes-$_dia $_HORA $_NOVA_DATA day ago"
else
        _NOVA_DATA=`echo $_NOVA_DATA | tr "+" " "`
        date --date="$_ano-$_mes-$_dia $_HORA $_NOVA_DATA day"
fi

Abraços

Rodrigo Luis Silva

Gestor de equipes especialista em sistemas GNU/Linux com vasta experiência em gerenciamento de storage, virtualização, network, desenvolvimento e outros.

More Posts - Website

Follow Me:
Twitter

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Home Linux Como Fazer Cálculos e Formatação de Data no Linux