
Eu tenho dois carimbos de data / hora, um é assim 24MAR17:00:14:09
e outro é assim 2017-03-25 05:52:09.373941000
e quero comparar os dois carimbos de data / hora iguais ou não. Tentei muitas funções de data e função awk, mas nada me deu resultados, por favor me ajude.
Responder1
festasolução:
#!/bin/bash
d1='24MAR17:00:14:09'
d2='2017-03-25 05:52:09.373941000'
d1="$(sed -E 's/^([0-9]{2})([A-Z]{3})([0-9]{2}):/\1-\2-\3 /' <<< $d1)"
if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then
echo "dates are equal"
else
echo "dates are unequal"
fi
Responder2
Tente isso,
A hora 2017-03-25 05:52:09.373941000
pode ser convertida para o primeiro formato 24MAR17:00:14:09
e depois fazer uma comparação.
date_in="24MAR17:00:14:09"
date_out=`date +%d%b%y:%H:%M:%S -d "2017-03-25 05:52:09.373941000" | tr '[:lower:]' '[:upper:]'`
[ $date_in == $date_out ] && echo "The dates match"
Responder3
O principal problema é analisar as strings fornecidas. O comando date aceita apenas alguns formatos, não todos. A solução é aproveitar a capacidade de aceitar datas do busybox (quase)qualquerformatar.
D1
Crie uma string de formato que imprima uma data no mesmo formato fornecido:
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
Use essa string para informar à data do busybox como analisar a string de data. Esteja ciente de que o TZ local pode alterar o resultado, use -u (UTC) para evitar erros ou certifique-se de definir o TZ correto para a sequência de tempo a ser analisada.
$ d1='24MAR17:00:14:09' $ busybox date -u -D '%d%b%y:%T' -d "$d1" Fri Mar 24 00:14:09 UTC 2017
Faça a data do busybox para imprimir o valor em segundos (desde a época):
$ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s' 1490314449
D2
Você pode repetir o procedimento para o segundo timestamp também, mas, neste caso, a string é entendida diretamente por data:
$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129
E a data do busybox removendo os nanossegundos ( ${d2%.*}
) (mais sobre isso mais tarde):
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
Diferença
Você deveria ter capturado os resultados acima em duas variáveis:
$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"
Em seguida, calcule a diferença e compare com zero:
$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different
Ou compare diretamente as strings (não os valores):
$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different
Nanossegundos
Existem três questões se você precisar comparar também nanossegundos.
O primeiro valor não possui nanossegundos. A primeira é que a primeira data não possui o valor de nanossegundos.
Você pode acrescentar 9 zeros:$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')" $ resd1="$resd1""$(printf '%0*d' 9 0)" $ echo "$resd1"echo "$resd2 - $resd1" 1490314449000000000
Ou (melhor) reprocesse o valor com data:
$ resd1="$(date -u -d "@$resd1" +'%s%N')" $ echo "$resd1" 1490314449000000000
A segunda data tem nanossegundos. Neste caso, a segunda data tem um formato que a data poderia processar diretamente, mas se tivesse um formato que exigisse pré-processamento por data do busybox, precisaremos anexar os nanossegundos mais tarde. Como um exemplo:
$ d2='2017-03-25 05:52:09.373941000' $ resd2="$(busybox date -u -D '%Y-%m-%d %T' -d "$d2" +'%s')${d2##*.}" $ echo "$resd2" 1490421129373941000
E o bash que você está executando precisa ser capaz de processar números inteiros de 64 bits.
Se sim, calcule a diferença:$ echo "(( $resd2 - $resd1 ))" (( 1490421129373941000 - 1490314449000000000 )) $ echo "$(( $resd1 - $resd2 ))" 106680373941000
O que equivale a pouco mais de 106 mil segundos (~29 horas):
$ echo "$(( ($resd2 - $resd1)/10**9 ))" 106680