O principal problema é analisar as strings fornecidas. A data do comando aceita apenas alguns formatos, não todos. A solução é aproveitar a capacidade de data do busybox de aceitar (quase) qualquer formato .
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 cadeia para informar à data do busybox como analisar a cadeia 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 cadeia 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
-
Cria 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ê também pode repetir o procedimento para o segundo timestamp, mas, nesse caso, a string é entendida por data diretamente:
$ 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 depois):
$ busybox date -u -d "${d2%.*}" +'%s'
1490421129
Diferença
Você deve 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 problemas se você precisar comparar também nanossegundos.
-
O primeiro valor não tem nanossegundos.
A primeira é que a primeira data não tem o valor de nanossegundos.
Você pode anexar 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) reprocessar o valor com a data:
$ resd1="$(date -u -d "@$resd1" +'%s%N')"
$ echo "$resd1"
1490314449000000000
-
A segunda data tem nanossegundos.
Nesse caso, a segunda data tem um formato que a data poderia processar diretamente, mas se tivesse um formato que exigisse o pré-processamento pela data do busybox, precisaríamos acrescentar os nanossegundos mais tarde. Como 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 inteiros de 64 bits.
Se sim, calcule a diferença:
$ echo "(( $resd2 - $resd1 ))"
(( 1490421129373941000 - 1490314449000000000 ))
$ echo "$(( $resd1 - $resd2 ))"
106680373941000
Que é um pouco mais de 106 mil segundos (~ 29 horas):
$ echo "$(( ($resd2 - $resd1)/10**9 ))"
106680