Wie finde ich einen Unterschied zwischen zwei Zeitstempeln bis zu Millisekunden?

10

Ich bin neu im Shell-Scripting. Das Herzstück meines Skripts ist es, den Unterschied zwischen zwei Zeitstempeln bis zu Millisekunden zu ermitteln. Bei mir habe ich eine Datei mit Inhalt von Zeitstempeln nur als

2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447

Auf diese Weise habe ich ungefähr 30.000 Datensätze, bei denen ich beim Ausführen eines Skripts keine Leistungsprobleme haben sollte. Viele Faktoren wie Schaltjahr, Monate mit 31 Tagen usw. kommen ins Spiel, wenn ich versuche, ein Skript dafür zu schreiben.

Kann mir bitte jemand dabei helfen?

Vamshi G.
quelle
1
Kommt die Sommerzeit ins Spiel? Schaltsekunden? Was sind die DST-Regeln? Haben sie sich im Laufe der Zeit in Ihrem Land verändert? Müssen Sie sich mit Daten vor 1970 oder vor einem Wechsel zum gregorianischen Kalender befassen?
Stéphane Chazelas

Antworten:

13

Sie müssen kein komplexes Parsen durchführen. erledigt mit Hilfe seines Freundes die ganze Magie für Sie. :

#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
  secdiff=$((
    $(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
  ))
  nanosecdiff=$((
    $(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
  ))
  printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
    (secdiff * 1000) + (nanosecdiff / 1000000)
  ))
done < YOUR_FILE.txt

AUSGABE

2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds

Sehen man date

HINWEIS

  • date -d ist sehr nützlich, es konvertiert Zeitstempel
  • %sist die Epochenzeit (Sekunden seit dem 01.01.1970)
  • %Nist Nanosekunden
  • $(( ))und (( ))für bashArithmetik siehe http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) steht für command substitution

Passt das auch zu Ihren Bedürfnissen?

Gilles Quenot
quelle
1
Ein arithhmetischer Fehler wurde korrigiert (Verkettung von Sekunden und Nanosekunden). Jetzt berechne ich zuerst die Sekunden (OP hat das nicht gefragt, aber für die Vollständigkeit und Robustheit bei der Wiederverwendung)
Gilles Quenot
0

Eine Skriptsprache wie Perl, Python oder Ruby ist schnell und erfordert wenig Aufwand. Zum Beispiel mit Perl und Date :: Parse :

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(Ersetzen Sie für jede Zeile ,durch ., teilen Sie die Zeile in Wörter $_[0]durch $_[3], analysieren Sie die Daten der ersten beiden und der nächsten beiden Wörter und drucken Sie die Differenz aus.)

Gilles 'SO - hör auf böse zu sein'
quelle
"Wenig Aufwand" ist relativ. Klar, wenn Sie ein X-Programmierer sind und etwas über die Y-Bibliothek wissen, ist das ein Kinderspiel. So ist es immer. Eigentlich bin ich überrascht, dass ein Python-Programmierer hier noch nicht reingesprungen ist. Ich denke, es ist nur eine Frage der Zeit ...: - \
Mike S
0

Ich bin gerade auf diesen Beitrag gestoßen, es gibt - zumindest heute - eine einfachere dateLösung. Verwendung des Frameworks in der Antwort von @Gilles Quenot (hätte einen Kommentar zu seiner Antwort geschrieben, aber nicht genug Ruf):

while read d1_1 d1_2 d2_1 d2_2
do
    date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END

Das Ergebnis:

$ ./time_elapsed.sh 
0.007000000

Wenn Sie %3Nanstelle von verwenden, %Nwird die Ausgabe auf Millisekunden gekürzt.

Zoltan K.
quelle