단순히 오늘 날짜 출력을 넘어서, 며칠 전/후 라든가, 연/월/일 등을 추출하고 싶다면?
잘 정리된 문서도 쉽게 찾을 순 있었지만..
그냥, 오늘 날짜를 출력하기 위해선 date
면 충분하다.
$ date 2020. 10. 19. (월) 15:16:42 KST
표현을 좀 달리하여 출력하려면, 이런 식으로 멋을 부려본다.
$ date +%F-%T 2020-10-19-15:29:00
그럼 어제 날짜는? 가감은 이런 식으로 하면 된다.
≥ date -d "-1 day" 2020. 10. 18. (일) 15:29:08 KST ≥ date -d "+10 days" 2020. 10. 29. (목) 15:29:25 KST
어제(또는 특정일) 특정 시간을 할당하려면? 예를 들어 어제 오후 4시 32분은?
$ date -d "-1 day 16:32" 2020. 10. 29. (목) 16:32:00 KST
단수일 땐 day, 복수일 땐 days! 이렇게 써야만 영문법에는 맞겠지만.. 단/복수 상관없이 그냥 day/days 어느 걸 써도 오류가 발생하진 않는다.
** ‘일’을 쓰려면 day, 연/월/일, 시/분/초 모두 영문을 쓰면 된다. year, minute 등등.
여기까지는 ‘오늘’ 날짜 기준. 즉, ‘오늘’을 출력하거나, ‘오늘’보다 며칠 전/후를 계산할 때는 위와같이 하면 되는데, 기준이 오늘이 아니라면?
사실 -d, 즉 –date 는 기준 날짜를 줄 때 사용하는 선택 사항이다.
$ date --date "20-3-31" 2020. 03. 31. (화) 00:00:00 KST
우리나라 식으로 ‘연-월-일’ 이렇게 줘도 되고, 외국(미국?) 식으로 ‘월/일/연’ 이렇게 해도 된다.
그럼, 날짜에서 연, 월, 일을 따로 출력하려면?
즉, 오늘 날짜의 ‘월’은?
+%Y, +%m, +%d 형식을 쓴다. 대소문자 구분을 해야 한다. (자세한 사항은 FORMAT controls the output. 항목 참고)
≥ date "+%Y" 2020 ≥ date "+%m" 10 ≥ date "+%d" 19 ≥ date "+%Y-%m-%d" 2020-10-19
이제 마지막. 위에 설명한 두가지를 한꺼번에 써본다.
‘특정일’을 지정한 뒤, 연/월/일을 출력하려면?
date --date "5/1/20" "+%Y" 2020
‘특정일’에서 날짜를 계산하려면?
date --date "20-4-30 +51 day" 2020. 06. 20. (토) 00:00:00 KST
따옴표 안에 날짜와 계산식이 모두 들어가 있어야 한다.
이제 최종 심화 학습.
특정 날짜에서 45일을 더하고, 그 날짜의 “연-월-일”을 출력하고 싶다. 사실 이걸 하기 위해서 먼 길을 달려왔다.
“특정 날짜”는 프로그램(Shell Script)에서 임의로 지정된다는 가정하에 진행한다.
오류를 확실히 하기 위해, 먼저 틀린 방법을 넣어본다. (이렇게 할 필요가 전혀 없었는데.. 오랜만에 Shell script 를 하다보니 감이 많이 떨어져있었다.)
TODAY_DATE=$(date) YESTERDAY_DATE=$(date --date "$TODAY_DATE -1 day")
이러면 오류가 발생한다. 첫번째가 아니라 두번째에서.--date
는 ‘날짜’ 형식으로 인수를 받는데, $TODAY_DATE 는 날짜 뿐만 아니라 시간과 시간대까지 포함하고 있으므로 제대로 처리되지 않는다. 시간까지는 –date 에서 인식을 하지만, 날짜 문자열 형식이 다르고, KST 등이 들어가 있어서 제대로 인식되지 않는 듯 하다.
이렇게 넣으면 문제는 없다.
$ date --date "2020-9-19 14:16:05" 2020. 09. 19. (토) 14:16:05 KST
아무튼, 날짜를 Shell 에서 연산 하려면, ‘날짜’만을 출력하도록 바꿔줘야 한다. 또는 시간이 필요하다면 “연-월-일 시:분:초” 형식을 사용해야 한다.
$ TODAY_DATE=$(date "+%D") # 또는 +%F 도 된다. %F = YYYY-MM-DD $ YESTERDAY_DATE=$(date --date "$TODAY_DATE -1 day" "+%D") $ echo $YESTERDAY_DATE 10/18/20
허나.. $YESTERDAY_DATE 는, 굳이 저렇게 할 필요는 없고 그냥 -1 day 만 넣어주면 된다. 즉, 어제를 구하기 위해선,
YESTERDAY_DATE=$(date --date "-1 day" "+%D")
이거면 충분하다.
** 충분하다고 생각했으나.. (21.05.12 추가)
경과 시간을 기록할 일이 생겨버렸다. 시작시간과 종료시간만 있으면 간단하지만.. 이걸 구현하려면 일반 문자열이 아닌 Epoch 형식으로 결과를 얻어내야 한다.
START_TIME=$(date +%s) END_TIME=$(date +%s)
+%s
만 붙여주면 된다. 이 결과는 이렇다.
$ date +%s 1620826522 $ date 2021. 05. 12. (수) 22:35:51 KST
이 값으로 계산을 해주면 끝인데..
$ TIME_DURATION=$(( $END_TIME - $START_TIME )) $ echo $TIME_DURATION 98
98 이면 1분 38초인데.. 그냥 이 정도는 계산이 되지만, 백단위만 넘어가도 보기가 편하질 않다.
이에, 이런 명령을 사용한다.
date -u -d @${TIME_DURATION} +%T
자세한 설명은 sampson-chen 에게 넘기기로 하고, 출력은 이렇다.
$ date -u -d @${TIME_DURATION} +%T 00:01:38
훨씬 눈에 편하지? 이것도 Eye candy 라 해도 되려나?