bash를 사용하여 시간을 빼시겠습니까?

bash를 사용하여 시간을 빼시겠습니까?

Bash를 사용하여 24시간 시간을 포함하는 변수를 빼는 것이 가능합니까?

#!/bin/bash
var1="23:30" # 11:30pm
var2="20:00" # 08:00pm

echo "$(expr $var1 - $var2)"

실행하면 다음 오류가 발생합니다.

./test 
expr: non-integer argument

출력을 10진수 형식으로 표시해야 합니다. 예를 들면 다음과 같습니다.

./test 
3.5

답변1

date명령의 입력은 매우 유연합니다. 다음과 같이 이점을 활용할 수 있습니다.

#!/bin/bash
var1="23:30"
var2="20:00"

# Convert to epoch time and calculate difference.
difference=$(( $(date -d "$var1" "+%s") - $(date -d "$var2" "+%s") ))

# Divide the difference by 3600 to calculate hours.
echo "scale=2 ; $difference/3600" | bc

산출:

$ ./test.bash
3.50

답변2

bash외부 프로그램 없이 를 사용하여 다음을 수행할 수 있습니다.

#!/bin/bash

# first time is the first argument, or 23:30     
var1=${1:-23:30}
# second time is the second argument, or 20:00
var2=${2:-20:00}

# Split variables on `:` and insert pieces into arrays
IFS=':' read -r -a t1 <<< "$var1"
IFS=':' read -r -a t2 <<< "$var2"

# strip leading zeros (so it's not interpreted as octal
t1=("${t1[@]##0}")
t2=("${t2[@]##0}")

# check if the first time is before the second one
if (( t1[0] > t2[0] || ( t1[0] == t2[0] && t1[1] > t2[1]) ))
then
  # if the minutes on the first time are less than the ones on the second time
  if (( t1[1] < t2[1] ))
  then
    # add 60 minutes to time 1
    (( t1[1] += 60 ))
    # and subtract an hour
    (( t1[0] -- ))
  fi
  # now subtract the hours and the minutes
  echo $((t1[0] -t2[0] )):$((t1[1] - t2[1]))
  # to get a decimal result, multiply the minutes by 100 and divide by 60
  echo $((t1[0] -t2[0] )).$(((t1[1] - t2[1])*100/60))
else
  echo "Time 1 should be after time 2" 2>&1
fi

시험:

$ ./script.sh 
3:30
3.50

$ ./script.sh 12:10 11:30
0:40
0.66

$ ./script.sh 12:00 11:30
0:30
0.50

날짜에 따라 더 복잡한 시차를 원한다면 GNU Date를 사용하는 것이 더 좋습니다.

답변3

Awk를 사용하면 구분 기호를 공백이나 콜론으로 설정하여 원하는 계산을 수행할 수 있습니다.

#!/bin/bash
var1="23:30"
var2="20:00"
echo "$var1" "$var2" |  awk -F":| " '{print (60*($1-$3)+($2-$4))/60 }'

답변4

수동으로 계산하는 것이 쉬워야 합니다.

$ printf '%02d:%02d\n' "$(((d=(${var1/:/*60+})-(${var2/:/*60+})),d/60))" "$((d%60))"
03:30

이는 $var1이후에 $var2그렇지 않으면 비슷한 결과를 얻을 것이라고 가정합니다 -02:-21.

또는 zsh/ksh93/yash의 부동 소수점의 경우:

$ echo "$((((${var1/:/*60+})-${var2/:/*60+})/60.))"
3.5

사용해야 하는 경우 bash(부동 소수점 연산은 지원되지 않음):

$ awk 'BEGIN{print ARGV[1]/60}' "$(((${var1/:/*60+})-${var2/:/*60+}))"
3.5

부동 소수점 부분을 수동으로 계산할 수도 있습니다.전체 계산을 수행awk.

관련 정보