bash script2023. 4. 11. 11:49

반달가면 이글루에서 백업 - http://bahndal.egloos.com/543840

 

2014년 7월 11일과 2015년 3월 30일은 며칠 차이가 날까? date 명령을 이용해서 간단하게 계산할 수 있다. 우선 아래의 예시를 보자.

# 2014.7.11 KST -> 1970.1.1 00:00:00 UTC 이후 몇초가 흐른 시점인가?
date -d "20140711" "+%s"
1436540400

date 명령에서 -d 옵션은 현재 시간이 아니라 -d 옵션 이후에 지정된 인자를 기준으로 삼기 위한 것이다. 표시 형식을 "%s"로 지정하면 1970.1.1 00:00:00 UTC 이후 몇초가 지난 시점인지 알려준다.

처음에 제시한 문제로 돌아가서 계산 방법을 생각해 보자. 2014년 7월 11일을 "%s" 형식으로 바꾸고 2015년 3월 30일을 마찬가지로 "%s" 형식으로 바꾼다. 그 다음 두 값의 차이를 구하면 두 날짜의 시간차(단위:초)가 된다.

초 단위의 시간차를 일 단위로 환산하려면 86400으로 나누면 되겠다(1일=86400초). 이 계산은 bc 명령을 이용하면 된다. 아래의 예시를 보자.

# 날짜를 1970.1.1 자정을 기준으로 초 단위로 환산
first_date=`date -d "20140711" "+%s"`
second_date=`date -d "20150330" "+%s"`
# 두 날짜의 차이 계산 (단위: 일)
diff_date=`echo "($second_date - $first_date) / 86400" | bc`
echo "날짜 차이(일): $diff_date"

비슷한 문제를 하나 더 생각해 보자. 2014년 7월 11일 오후 2시 10분 33초와 2015년 3월 30일 오전 11시 35분 11초는 몇시간 차이가 나는 것일까? 초 단위로 계산한 값을 이번에는 3600으로 나누면 된다(1시간=3600초). 아래의 예시를 보자.

first_date=`date -d "20140711 14:10:33" "+%s"`
second_date=`date -d "20150330 11:35:11" "+%s"`
diff_hour=`echo "($second_date - $first_date) / 3600" | bc`
echo "날짜 차이(시간): $diff_hour"

언뜻 보면 위의 계산법이 유효하기 위해 대상 날짜가 반드시 UTC 기준으로 1970년 1월 1일 이후가 되어야 할 것 같기도 하지만, 그 이전의 날짜로도 계산이 다 된다. -d 옵션에서 지정한 날짜가 1969년 12월 31일 이전이라면 "%s" 형식으로 표시할 때 음수(-)로 표시되기 때문이다. 만약 이 값이 -10이라면 1970년 1월 1일 자정이 되기 10초전이라는 뜻이다.

728x90
Posted by 반달가면