
Ich habe zwei Zeitstempel, einer ist so 24MAR17:00:14:09
und 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.373941000
kann in das erste Format konvertiert 24MAR17:00:14:09
und 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)
Erstellen Sie eine Formatzeichenfolge, die ein Datum im gleichen Format wie angegeben druckt:
$ date -u +'%d%b%y:%T' 07Jul17:15:18:48
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
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.
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
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
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