Você não pode subtrair duas datas escritas em um formato YYYYMMDD. Por exemplo, 20150907 - 20140907
obviamente gera 10000 em vez de 365.
20150907 - 20150907
produz rendimento 0 - é uma maneira válida de testar a igualdade, exceto pelo fato de que você poderia testar a igualdade diretamente em vez de calcular a subtração. Se você está recebendo -20150907
, é porque o código não é o que você mostrou, e v_sysdate
contém caracteres extras (além de espaço em branco e dígitos).
A maneira sã de manipular datas é convertê-las em um formato numérico simples: número de unidades de tempo desde uma origem fixa (uma época ). No mundo Unix , a unidade padrão é segundos (como no SI) e a época é 1970-01-01.
Os utilitários GNU, como date
e stat
, imprimem as datas em segundos desde a época com o formato %s
. Use este formato até que você precise imprimi-lo. Para passar date
uma data neste formato, coloque @
antes do número de segundos.
v_date=$(stat -c '%Z' file)
v_sysdate=$(date +%s)
v_date_difference=$((v_sysdate-v_date))
date -d "@$v_date" +'File ctime: %Y%M%D'
date -d "@$v_sysdate" +'Current time: %Y%M%D'
echo "$v_date_difference seconds elapsed"
echo "$((v_date_difference / 86400)) days elapsed"
Observe que isso calcula o número de dias entre os dois horários. Por exemplo, entre ontem 23:59 e hoje 00:01, isso mostra uma diferença de 0 dias. Se você precisar da diferença entre duas datas, ignorando a hora do dia, você pode usar um horário de referência durante o dia.
file_midday_time=$(date +%s -d "$(date '+%Y-%m-%d 12:00' -d "@$(stat -c %Z file)")")
current_midday_time=$(date +%s -d "today 12:00")
day_difference=$(((file_midday_time - current_midday_time + 7200) / 86400))
A adição de um número entre 3601 e 86399 garante que um dia seja contabilizado, mesmo no dia em que os relógios mudam do horário normal para o horário de verão (esse dia dura apenas 23 horas).