Wie subtrahiert man die Zeit in AM und PM in einem Shell-Skript korrekt?

Wie subtrahiert man die Zeit in AM und PM in einem Shell-Skript korrekt?

Ich stehe vor einer Situation: Angenommen, ich subtrahiere 01:00:00 Uhr und 23:00:00 Uhr und verwende mein folgendes Skript. Dann erhalte ich eine Differenz von 21 Stunden, obwohl es eigentlich nur 2 Stunden sind.

Hier ist mein Skript:

#!/bin/sh

Tm1=$(echo `date +%H:%M:%S`)
T1=`date -d "$Tm1" +%r`
X1=$(echo $T1 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')

Tm2=$(cat $DIR/session_$DATE.txt | awk '{print $5}' | head -1)
T2=`date -d "$Tm2" +%r`
X2=$(echo $T2 | awk -F: '{print ($1 *3600) + ($2 * 60) + $3}')

diff=$(($X1-$X2))


TimeDifference=$(echo print $diff/3600. | python)
echo $TimeDifference

Gibt es eine Möglichkeit, dies zu erreichen? Bitte schlagen Sie vor.

BEARBEITEN:

$DIR/session_$DATE.txt

Es handelt sich um eine Netezza-Sitzungsdatei mit ähnlichen Zeilen wie unten. Es wird nur die erste Zeile unten angezeigt:

26195 sql-odbc XXX  27-May-21 01:18:51 CDT

Antwort1

An Ihrem Skript ist so vieles falsch, dass man kaum weiß, wo man anfangen soll. Ich würde mich mit „Sie machen das viel komplizierter, als es sein muss“ zufrieden geben.

Aus Ihrem Skript geht hervor, dass Sie die Anzahl der Stunden zwischen a) dem Datum und der Uhrzeit in einer Protokolldatei und b) dem aktuellen Zeitpunkt wissen möchten. Daher:

  1. Sie benötigen das aktuelle Datum und die aktuelle Uhrzeit im Format „Sekunden seit Epoche“ (*).

    X1="$(date +%s)"
    
  2. Sie benötigen das Datum und die Uhrzeit aus der ersten Zeile der Sitzungsprotokolldatei, ebenfalls umgerechnet in Sekunden seit der Epoche.

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. Sie müssen die Differenz zwischen diesen beiden Daten (X1-X2) in Stunden (/3600) berechnen.

    let diff=(X1-X2)/3600
    

Beispiel:

#!/bin/bash

# get current time
X1="$(date +%s)"

# get the date, time, and timezone from the last 3 fields of the first line
logfile=session.txt
X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' "$logfile")" +%s)"

# calculate the difference in hours.  Note that bash arithmetic is integer only,
# so the result of the division is automatically rounded down.
let diff=(X1-X2)/3600

echo $diff

(*) Aus historischen Gründen wird die „Epoche“ als Mitternacht am 1. Januar 1970 definiert. „01-01-1970 00:00:00“. Es spielt keine Rolle, wann das ist, es ist ein praktischer gemeinsamer Bezugspunkt für Datums- und Zeitberechnungen in Sekunden.

verwandte Informationen