如何在shell腳本中正確減去AM和PM的時間?

如何在shell腳本中正確減去AM和PM的時間?

我面臨一個情況,假設我使用下面的腳本減去 01:00:00 AM 和 23:00:00 PM,我會得到 21 小時的差異,而實際上只有 2 小時。

這是我的腳本:

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

有辦法實現這一點嗎?請建議。

編輯:

$DIR/session_$DATE.txt

它是一個 netezza 會話文件,具有類似的行,如下所示。下面僅顯示第一行:

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

答案1

你的腳本有太多問題,很難知道從哪裡開始。我會滿足於「你讓這種方式變得比需要的更複雜」。

從您的腳本來看,您似乎想知道a)日誌檔案中的日期和時間與b)現在之間的小時數。所以:

  1. 您需要以自紀元來的秒數 (*) 格式表示的當前日期和時間。

    X1="$(date +%s)"
    
  2. 您需要從會話日​​誌檔案的第一行中提取的日期和時間,也轉換為自紀元以來的秒數。

    X2="$(date -d "$(awk 'NR==1 {print $(NF-2),$(NF-1),$NF; nextfile}' session.txt)" +%s)"
    
  3. 您需要計算這兩個日期之間的差異 (X1-X2),以小時 (/3600) 為單位。

    let diff=(X1-X2)/3600
    

例子:

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

(*) 由於歷史原因,「紀元」被定義為 1970 年 1 月 1 日午夜。 「01-01-1970 00:00:00」。它是什麼時候並不重要,它是使用秒進行日期和時間計算的方便的通用參考點。

相關內容