Wie vergleicht man zwei Zeitstempel?

Wie vergleicht man zwei Zeitstempel?

Ich habe zwei Zeitstempel, einer ist so 24MAR17:00:14:09und der andere so 2017-03-25 05:52:09.373941000, und ich möchte die beiden Zeitstempel vergleichen, ob sie gleich sind oder nicht. Ich habe viele Datums- und AWK-Funktionen ausprobiert, aber nichts hat Ergebnisse geliefert. Bitte helfen Sie mir.

Antwort1

SchlagLösung:

#!/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

Antwort2

Versuche dies,

Die Zeit 2017-03-25 05:52:09.373941000kann in das erste Format konvertiert 24MAR17:00:14:09und dann ein Vergleich durchgeführt werden.

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"

Antwort3

Das Hauptproblem ist die Analyse der bereitgestellten Zeichenfolgen. Der Befehl date akzeptiert nur einige Formate, nicht alle. Die Lösung besteht darin, die Fähigkeit von busybox date zu nutzen, (fast)beliebigFormat.

T1 (T1)

  1. Erstellen Sie eine Formatzeichenfolge, die ein Datum im gleichen Format wie angegeben druckt:

    $ date -u +'%d%b%y:%T'
    07Jul17:15:18:48
    
  2. Verwenden Sie diese Zeichenfolge, um busybox date mitzuteilen, wie die Datumszeichenfolge analysiert werden soll. Beachten Sie, dass die lokale Zeitzone das Ergebnis ändern kann. Verwenden Sie -u (UTC), um Fehler zu vermeiden, oder stellen Sie sicher, dass Sie die richtige Zeitzone für die zu analysierende Zeitzeichenfolge festlegen.

    $ d1='24MAR17:00:14:09'
    $ busybox date -u -D '%d%b%y:%T' -d "$d1"
    Fri Mar 24 00:14:09 UTC 2017
    
  3. Stellen Sie Busybox Date so ein, dass der Wert in Sekunden (seit Epoche) gedruckt wird:

    $ busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s'
    1490314449
    

T2 - Der zweite Tag

Sie können den Vorgang auch für den zweiten Zeitstempel wiederholen, in diesem Fall wird die Zeichenfolge jedoch direkt vom Datum verstanden:

$ d2='2017-03-25 05:52:09.373941000'
$ date -u -d "$d2" +'%s'
1490421129

Und busybox date, indem die Nanosekunden ( ${d2%.*}) entfernt werden (mehr dazu später):

$ busybox date -u -d "${d2%.*}" +'%s'
1490421129

Unterschied

Sie sollten die obigen Ergebnisse in zwei Variablen erfasst haben:

$ resd1="$(busybox date -u -D '%d%b%y:%T' -d "$d1" +'%s')"
$ resd2="$(date -u -d "$d2" +'%s')"

Berechnen Sie dann die Differenz und vergleichen Sie sie mit Null:

$ (( resd1-resd2 )) && echo "Dates are different" || echo "Dates are equal"
Dates are different

Oder vergleichen Sie direkt die Zeichenfolgen (nicht die Werte):

$ [[ "$resd1" == "$resd2" ]] && echo "equal" || echo "different"
different

Nanosekunden

Wenn Sie auch Nanosekunden vergleichen müssen, treten drei Probleme auf.

  1. Der erste Wert hat keine Nanosekunden. Das erste ist, dass das erste Datum keinen Nanosekundenwert hat.
    Sie können 9 Nullen anhängen:

    $ 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
    

    Oder (besser) verarbeiten Sie den Wert erneut mit Datum:

    $ resd1="$(date -u -d "@$resd1" +'%s%N')"
    $ echo "$resd1"
    1490314449000000000
    
  2. Das zweite Datum hat Nanosekunden. In diesem Fall hat das zweite Datum ein Format, das das Datum direkt verarbeiten könnte, aber wenn es ein Format hätte, das eine Vorverarbeitung durch das Busybox-Datum erfordert, müssen wir die Nanosekunden später anhängen. Als Beispiel:

    $ 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. Und die von Ihnen ausgeführte Bash muss in der Lage sein, 64-Bit-Ganzzahlen zu verarbeiten.
    Wenn ja, berechnen Sie die Differenz:

    $ echo "(( $resd2 - $resd1 ))"
    (( 1490421129373941000 - 1490314449000000000 ))
    
    $ echo "$(( $resd1 - $resd2 ))"
    106680373941000
    

    Das sind etwas mehr als 106.000 Sekunden (~29 Stunden):

    $ echo "$(( ($resd2 - $resd1)/10**9 ))"
    106680
    

verwandte Informationen