Как правильно вычесть время в формате AM и PM в скрипте оболочки?

Как правильно вычесть время в формате 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_$ДАТА.txt

это файл сессии netezza с похожими строками, как ниже. Показана только первая строка ниже:

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

решение1

В вашем сценарии так много ошибок, что трудно понять, с чего начать. Я соглашусь на «вы делаете это более сложным, чем это необходимо».

Глядя на ваш скрипт, кажется, что вы хотите узнать количество часов между а) датой и временем в файле журнала и б) настоящим моментом. Поэтому:

  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

(*) по историческим причинам «эпоха» определяется как полночь 1 января 1970 года. «01-01-1970 00:00:00». Неважно, когда это произойдет, это удобная общая точка отсчета для выполнения расчетов даты и времени с использованием секунд.

Связанный контент