Como comparar dois carimbos de hora?

2

Eu tenho dois timestamps um é assim 24MAR17:00:14:09 e outro é assim 2017-03-25 05:52:09.373941000 e eu quero comparar os dois timestamps mesmo ou não eu tentei uma função de data muito e função awk mas nada me dando resultados por favor me ajude.

    
por Rahul 07.07.2017 / 08:55

3 respostas

1

Solução

bash :

#!/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}):/-- /' <<< $d1)"

if [[ $(date -d "$d1") == $(date -d "$d2") ]]
then 
    echo "dates are equal"
else 
    echo "dates are unequal"
fi
    
por 07.07.2017 / 10:37
1

Tente isso,

O tempo 2017-03-25 05:52:09.373941000 pode ser convertido para o primeiro formato 24MAR17:00:14:09 e, em seguida, 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"
    
por 07.07.2017 / 10:32
1

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

  1. Crie uma string de formato que imprima uma data no mesmo formato fornecido:

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. 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
    
  3. 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.

  1. 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
    
  2. 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
    
  3. 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
    
por 07.07.2017 / 19:25