Diferença entre duas datas no Linux

1

Estou recebendo uma data no formato

    v_date=$(date +"%Y%m%d" -d "1970-01-01 + $(stat -c '%Z' file ) secs")
    v_sysdate=$(date +%Y%m%d)
echo "$v_date"

20150907

echo "$v_sysdate"

20150907

v_date_difference=$((${v_sysdate}-${v_date}))
echo "$v_date_difference"

O valor retornado é -20150907, mas deve ser zero.

Como posso obter a diferença entre as datas em dias inteiros?

    
por VRVigneshwara 07.09.2015 / 15:01

1 resposta

2

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).

    
por 08.09.2015 / 02:21