Como comparar dois carimbos de data/hora?

Como comparar dois carimbos de data/hora?

Eu tenho dois carimbos de data / hora, um é assim 24MAR17:00:14:09e outro é assim 2017-03-25 05:52:09.373941000e 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.373941000pode ser convertida para o primeiro formato 24MAR17:00:14:09e 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

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

  1. 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
    
  2. 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
    
  3. 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
    

informação relacionada