...
Date 명령어
리눅스 터미널에서 시스템 날짜를 알고 싶을때 사용하는 명령어가 대표적으로 date가 있다.
이외에도 다양한 옵션을 주면 다양한 날짜 포맷으로 변환해 사용할 수 있으며 과거 날짜 구하는 등 단순해 보이지만 정말 다양한 역할을 하는 명령어다.
date 명령어 사용 대표적인 예)
- 시스템 서버 시간 설정
- 설정되어 있는 날짜 값을 원하는 형태로 얻기
- 과거 미래 덧셈 뺄셈 등 원하는 날짜 출력하거나 차이 구하기
# format : 형식을 지정하기 위한 문자열 '+ %m/%d/%y %H:%M' 과 같이 사용할 경우 '11/11/20 17:11'과 같이 출력 됨.
$ date [option] [+FORMAT]
# mmddhhmm : 월, 일, 시간, 분을 나타내는 8자리 숫자로 super user가 시스템 날짜와 시간을 변경할 때 사용
# yy : 년도의 마지막 두자리로 super user가 시스템 날짜와 시간을 변경할 때 사용
$ date [option] [MMDDhhmm[YY]]
옵션 | 내용 |
-s [STRING] --set=[STRING] |
시간만 설정할 때 사용. 순서는 'hh:mm:ss' 또는 'hhmm'로 지정 |
-d [STRING] --date=[STRING] |
지정한 STRING 인자값에 해당하는 날짜를 파싱하여 출력 |
-r[FILE] --reference=[FILE] |
파일 혹은 폴더를 참조하여 해당 파일이나 폴더의 수정 일시를 출력 |
--u --utc --universal |
세계협정시각(UTC)로 출력 |
-I --iso-8601[=timespec] |
ISO-8601 형식으로 출력한다. 만일 timespec을 지정하면, 날짜나 시, 분, 초 중 하나를 출력한다. |
-f --file=datefile |
지정한 파일(datefile)에서 각의 행에 대한 날짜를 출력 |
Date 명령 날짜 출력 예제
현재 날짜 출력
$ date
Thu Jun 20 12:21:25 KST 2021
현재 날짜 변경
현재 시스템 시간을 2021년 07월 20일 오후 9시로 설정
# 시스템 시간이 동기화 해제. 그래야 날짜 변경이 적용된다.
$ timedatectl set-ntp 0 (or) timedatectl set-ntp false
$ date 0720210021 # '07월/20일/21시/00분/21년'
명령어 연습한 뒤 반드시 시간동기화를 다시 true로 해주자.
현재 시간 설정 (-s)
$ date -s 06:40:30 # 현재 시간을 오전 6시 40분 30초로 설정
날짜 계산 (-d)
※ 과거 날짜 구하기
$ date -d '1 second ago' # 1초전
$ date -d '2 seconds ago' # 2초전. s붙여도 되고 안붙여도 됨 모두 동일
$ date -d '1 minute ago' # 1분전
$ date -d '1 hour ago' # 1시간전
$ date -d 'yesterday' # 어제
$ date -d '2 days ago' # 2일전
$ date -d '1 week ago' # 1주일전
$ date -d '1 month ago' # 1달전
$ date -d '1 year ago' # 1년전
$ date -d '1 year 5 months ago' # 1년 5개월 전
$ date -d 'last monday' # 지난 월요일
# -숫자로도 표현이 가능
$ date -d '-1 second' # 1초전
$ date -d '-1 days' # 1일전
# --date 옵션
date --date='3 month ago'
시간의 단위를 나타내는 day, week, month 등은 복수형을 사용해도되고 단수형을 사용해도 상관 없다.
※ 미래 날짜 구하기
date -d '1 second' # 1초후
date -d '1 minute' # 1분후
date -d '1 hour' # 1시간후
date -d 'tomorrow' # 내일
date -d '1 day' # 내일
date -d '1 week' # 1주일 후
date -d '1 month' # 한달 후
date -d '1 year' # 1년 후
date -d '1 year 5 month' # 1년 5개월 후
date -d 'next monday' # 다음 월요일
date -d 'this thursday' # 이번주 목요일
# -숫자로도 표현이 가능
$ date -d '+1 second' # 1초후
$ date -d '+1 days' # 1일후
# --date 옵션
date --date='3 month'
과거 표현법에서 ago를 제외하면 된다.
날짜 파일 출력 (-f)
날짜가 입력된 파일을 라인 단위로 읽어와 출력해준다.
당연히 파일 내용으로는 위의 -d 옵션에 [STRING]인자값의 형식으로 기술되어 있어야 힌다.
# 데이터 파일에 저장했던 날짜를 읽어서 표시해준다.
$ date --file=sampleDatefile
$ date -f sampleDatefile
2002. 07. 28. (일) 00:00:00 KST
2008. 08. 05. (화) 00:00:00 KST
파일의 수정된 날짜 출력 (-r)
$ date -r 'testfile.txt'
Sun Jan 1 00:00:00 KST 2017
날짜/시간 더하기 빼기
출력된 날짜 기준으로 날짜를 더하거나 빼서 계산이 가능하다
방식은 ‘기준 날짜 + 날짜’ 혹은 ‘기준날짜 - 날짜’ 형태로 쓰면 알아서 계산이 된다.
# 기준날짜 어제에서 - 1일 = 그저께
$ date -d 'yesterday - 1 day'
# 기준날짜 내일에서 + 2일 = 3일 후
$ date -d 'tomorrow + 2 day'
# 4주전에 월요일
date -d '4 week ago monday'
# 4주전에 화요일
date -d '4 week ago monday + 1 day '
# 4주전에 화요일
date -d '4 week ago tuesday'
# 기준날짜 2020/10/03 12:10:05 에서 + 1일 + 1시간 + 1분 + 1초 하기
$ date -d '2020-10-03T12:10:05 + tomorrow 1hour 1minute 1second' + %FT%T
2020-10-04T13:11:06
날짜 포맷 형식 총정리
포맷이란 출력할 날짜의 형식(모양)을 지정하기 위한 문자조합이다.
예를 들어, '+ %m/%d/%y %H:%M' 과 같이 사용할 경우 '11/11/20 17:11'과 같이 출력 되게 된다.
$ date +포맷문자조합
$ date +"%G%m%e%H%M"
202203111351
포맷 문자 | 설명 |
%% | '%' 문자 자체 |
%a | 요일 약어 (예, Sun...MOn, 일...월) - local 기준 |
%A | 요일 전체 이름 (예, Sunday...Monday, 일요일...월요일) - local 기준 |
%b | 달 약어 (예, Jan...Dec, 1월...12월) - local 기준 |
%B | 달 전체 이름 (예, January...December, 1월...12월) - local 기준 |
%c | 날짜와 시간 (예, Thu Mar 3 23:05:25 2005, 2015년 12월 25일 (수) 오전 12시 50분 16초) - local 기준 |
%C | 세기 (4자리 연도에서 앞 두 자리만 나타낸다. 예, 21) |
%d | 그 달의 일 (예, 01...31) |
%D | 날짜 mm/dd/yy (즉, %m/%d/%y) |
%e | 빈칸 추가된 그 달의 일 (즉, %_d) |
%F | 전체 날짜 yyyy-mm-dd (즉, %Y-%m-%d) |
%g | 년도의 뒷 두자리 (%G와 반대) -- ISO |
%G | 년도 모든 자리 (참조 %V) -- ISO |
%h | %b와 같음 |
%H | 시간 (00..23) |
%I | 시간 (01..12) |
%j | 그 해의 일수 (001..366) |
%k | 시간 ( 0..23) |
%l | 시간 ( 1..12) |
%m | 달 (01..12) |
%M | 분 (00..59) |
%n | 다음 줄 |
%N | 나노초 (000000000..999999999) |
%p | 오전 또는 오후 (AM 또는 PM), 알 수 없을 땐 빈칸임 - local 기준 |
%P | %p와 같지만, 소문자임 |
%r | 12시간제 시간 (예, 11:11:04 PM, 오후 11시 11분 04초) - local 기준 |
%R | 24시간제 시간과 분 (%H:%M과 비슷) |
%s | 1970-01-01 00:00:00 UTC 이후로 지난 초 |
%S | 초 (00..60) |
%t | 탭 문자 |
%T | 시간 (즉, %H:%M:%S) |
%u | 주중 요일 (1..7); 1은 월요일 |
%U | 일요일 기준으로 1년중 몇 번째 주 (00..53) |
%V | 월요일 기준으로 1년중 몇 번째 주 (01..53) - ISO |
%w | 주중 요일 (0..6), 0은 일요일 |
%W | 월요일 기준으로 1년 중 몇 번째 주 (00..53) |
%x | 날짜 (예, 12/31/99) - local 기준 |
%X | 시간 (예, 23:13:48) - local 기준 |
%y | 두 자리 연도 (00..99) |
%Y | 네 자리 연도 (1970...) |
%z | +hhmm 숫자 타임존 (예, -0400) |
%:z | +hh:mm 숫자 타임존 (예, -04:00) |
%::z | +hh:mm:ss 숫자 타임존 (예, -04:00:00) |
%:::z | 추가된 타임존 (예, -04, +05:30) |
%Z | 알파벳 타임존 약어 (예, KST) |
# '%'문자를 출력
$ date +%%
%
# '요일'을 간략한 문자형태로 출력
$ date +%a # 일요일
Sun
# '요일'을 문자형태로 출력
$ date +%A # 일요일
Sunday
# '월'을 간략한 문자형태로 출력
$ date +%b # 1월
Jan
# '월'을 문자형태로 출력
$ date +%B # 1월
January
# 로컬에 설정된 형식으로 '일시'를 출력
$ date +%c # 2017-01-01 00:00:00
Sun 01 Jan 2017 12:00:00 AM KST
# '연도'에서 첫 두자리만 출력
$ date +%C # 2017-01-01
20
# '일'을 0을 포함한 숫자형태로 출력
$ date +%d # 2017-01-01
01
# '월/일/년' 형식으로 출력(+%m/%d/%y와 동일)
$ date +%D # 2017-01-01
01/01/17
# '일'을 공백을 포함한 숫자형태로 출력(+%_d와 동일)
$ date +%e # 2017-01-01
1
# '년-월-일'형식으로 출력(+%Y-%m-%d와 동일)
$ date +%e # 20170101
2017-01-01
# '연도'에서 마지막 두자리만 출력(+%G 참조)
# ISO(국제표준화기구)의 규정에 따라 2017년도여도 아직 52주차가 끝나지 않았으면 2016년도로 간주(+%V 참조)
$ date +%g # 2017-01-01
16
# '연도'를 출력
# 마찬가지로 ISO의 규정에 따라 2017년도지만 2016년도로 표현(+%V 참조)
$ date +%G # 2017-01-01
2016
# '월'을 간략한 문자형태로 출력(+%b와 동일)
$ date +%h # 1월
Jan
# '시'를 0을 포함한 24시 형식으로 출력(00..23)
$ date +%H # 17:00:00
17
# '시'를 0을 포함한 12시 형식으로 출력(01..12)
$ date +%I # 17:00:00
05
# 해당년도의 1월1일을 1일째로 시작하여 몇일째인지 출력(001..366)
$ date +%j # 2017-02-01
032
# '시'를 공백을 포함한 24시 형식으로 출력( 0..23, +%_H와 동일)
$ date +%k # 09:00:00
9
$ date +%k # 18:00:00
18
# '시'를 공백을 포함한 12시 형식으로 출력( 1..12, +%_I와 동일)
$ date +%l # 09:00:00
9
$ date +%l # 18:00:00
6
# '월'을 숫자형태로 출력(01..12)
$ date +%m # 1월
01
# '분'을 출력(00..59)
$ date +%M # 12:34:56
34
# 새로운 줄을 출력(개행문자)
$ date +%n%F # 2017-12-25
(개행)
2017-12-25
$ date +%D%n # 2017-12-25
(개행)
12/25/17
# '나노초'를 출력(000000000..999999999)
$ date +%N # 09:00:00.123456789
123456789
$ date +%3N # 09:00:00.123456789
123
# '오전/오후'를 출력(AM/PM)
$ date +%p # 09:00:00
AM
$ date +%p # 18:00:00
PM
# '오전/오후'를 출력(am/pm)
$ date +%P # 09:00:00
am
$ date +%P # 18:00:00
pm
# '시:분:초 오전/오후'를 12시 형식으로 출력(+'%H:%M:%S %p'와 동일)
$ date +%r # 18:00:00
06:00:00 PM
# '시:분'을 24시 형식으로 출력(+%H:%M과 동일)
$ date +%R # 18:00:00
18:00
# 협정세계시(UTC)를 기준으로 1970-01-01 00:00:00부터 해당일시까지 계산한 '초'를 출력
# 한국 표준시는 KST이므로 UTC기준 +9시간 부터 측정
$ date +%s # 1970-01-01 09:00:59
59
$ date +%s # 2017-01-01 09:00:00
1483228800
# '초'를 출력(00..60)
$ date +%S # 12:34:56
56
# 탭문자를 삽입
$ date +%t%D # 2017-01-01
( 탭 )01/01/17
$ date +%H%t%M%t%S # 12:34:56
12 34 56
# 시간을 출력(+%H:%M:%S와 동일)
$ date +%T # 12:34:56
12:34:56
# '요일'을 숫자형태로 출력(1..7, 1=Monday)
$ date +%u # 일요일
7
# 해당년도의 첫 일요일을 1주째로 시작하여 몇주째인지를 출력(00..53)
$ date +%U # 2016-01-01(금)
00
$ date +%U # 2016-12-31(수)
52
$ date +%U # 2017-01-01(일)
01
# 국제 표준화 기구 규정에 따라, 해당년도의 첫 월요일을 1주째로 시작하여 몇주째인지를 출력(01..53)
$ date +%V # 2016-01-01(금)
53
$ date +%V # 2017-01-01(일)
52
$ date +%V # 2017-01-02(월)
01
# '요일'을 숫자형태로 출력(0..6, 0=Sunday)
$ date +%w # 토요일
6
# 해당년도의 첫 월요일을 0주째로 시작하여 몇주째인지를 출력(00..53)
$ date +%w # 2017-02-01
05
# '월/일/년'형식으로 출력
$ date +%x # 2017-12-25
12/25/2017
# '시:분:초 오전/오후'형식으로 출력(+%r과 동일)
$ date +%X # 09:00:00
09:00:00 AM
# '연도'에서 마지막 두자리만 출력
$ date +%y # 2017-01-01
17
# '연도'를 출력
$ date +%Y # 2017-01-01
2017
# UTC(세계협정시)를 기준으로 로컬의 시간이 얼마나 차이나는지 '+/-시분'형식으로 알려줌.(한국은 KST로 UTC와 +0900차이가 남.)
$ date +%z # KST
+0900
$ date -u +%z # UTC
+0000
# UTC(세계협정시)를 기준으로 로컬의 시간이 얼마나 차이나는지 '+/-시:분'형식으로 알려줌
$ date +%:z # KST
+09:00
# UTC(세계협정시)를 기준으로 로컬의 시간이 얼마나 차이나는지 '+/-시:분:'형식으로 알려줌
$ date +%::z # KST
+09:00:00
# UTC(세계협정시)를 기준으로 로컬의 시간이 얼마나 차이나는지 '+/-시'형식으로 알려줌
$ date +%:::z # KST
+09
[자주 사용되는 포맷]
- %Y : 년도 (YY)
- %m : 월 (mm)
- %d : 일자 (dd)
- %H : 시간 (HH)
- %M : 분 (MM)
- %S : 초 (SS)
[이외 활용하면 좋은 포맷]
- %F : 년월일 (YYYY-mm-dd) 형태로 출력
- %T : 시간 (HH:MM:SS) 형태로 출력
- %u : 오늘에 해당하는 요일을 숫자로 표현 ( 1 = Monday, 2 = Tuesday ... 7 = Sunday )
- %U : 현재 주의 일요일 ( ISO 기준이며 한국시간과 비교하여 하루씩 늦다 )
[기타 포맷]
- %U(=%W) : 1년 중 일요일을 첫 번째 날로 지정하여 이번주의 해당하는 주를 확인(0부터 시작 -> 00..53)
- %V : ISO 표준을 따르며, 월요일을 첫 번째 날로 지정하여 이번주의 해당하는 주를 확인(1부터 시작 -> 01..53)
- %w - 요일을 숫자로 표현(0 ~ 6) 0 = 일요일 / 1 = 월요일 ...
%Y %m %d %H %M %S
년도, 월, 일, 시, 분, 초
%a %A %b
요일, 월을 영어로
$ date '+%Y-%m-%d' #년도-월-일
2019-06-20
$ date "+%Y-%m-%d %H:%M:%S" # YYYY-MM-DD HH24:MI:SS 포맷
2020-04-12 13:21:10
$ date "+%Y-%m-%d %I:%M:%S %p" #오전/오후 추가 출력
2020-04-12 13:21:10 AM
$ date --date='tomorrow' '+%Y-%m-%d' # 내일을 포맷으로 출력
2019-06-21
$ date -d "+1 months +3 days" "+%Y-%m-%d" # 특정 날짜를 정해진 포맷으로 출력
2020-05-15
$ date '+%H:%M' #시각:분
23:52
$ data +%s # unix time stamp 로 표시
1596521474
$ date '+%a'
Thu
$ date '+%A'
Thursday
$ date '+%b'
Jun
$ date '+B'
June
# 올해에서 현재까지 몇일이 지났는지
$ date +%j
171
# 파일명에 날짜 넣기
$ touch $(date '+%Y%m%d'); ls
20190620.txt
# 특정 날짜가 들어간 파일 추출하기
$ find /home/jhnyang/log "*$(date -d '2 days ago' '+%Y%m%s')*.txt"
# 시스템 날짜 변경
$ sudo date +%Y%m%d --set="20200412"
# 변수에 날짜 넣기
$ TIME=$(date +%FT%T)
$ echo $TIME
2020-10-27T12:21:55
#!/usr/bin/bash
# 두 날짜의 차이 구하기
FIRST_DATE=`date -d "20190620" "+%s"` # 해당 날짜 타임스탬프 구하기
SECOND_DATE=`date -d "20190120" "+%s"`
DAY_in_SECONDS=`expr 24 \* 3600` #1일을 초로 변환 > 86400
# 두날짜간의 차이를 구하고 일수(초단위)로 나누기
INTERVAL=`echo "(${FIRST_DATE} - ${SECOND_DATE}) / $DAY_in_SECONDS" | bc`
echo $INTERVAL
ISO8601 표준 규격 출력 (-I)
[TIMESPEC] 포맷에 들어가는 인자로는 hours, minutes, date, seconds, ns가 있다.
$ date -I # (or) -I'date'
2017-01-01
$ date -I'hours'
2017-01-01T00+0900
$ date -I'minutes'
2017-01-01T00:00+0900
$ date -I'second'
2017-01-01T00:00:00+0900
$ date -I'ns'
2017-01-01T00:00:00,000000000+0900
$ date +%FT%T # (YYYY-mm-dd)T(HH:MM:SS)
2020-10-27T12:00:38
RFC2822 표준 규격 출력 (--rfc-2822)
# RFC2822 형식 포맷 (-R, --rfc-2822) #
$ date -R
Sun, 01 Jan 2017 00:00:00 +0900
RFC3339 표준 규격 출력 (--rfc-3339)
# RFC3339 형식 포맷 (--rfc-3339=[TIMESPEC]) #
# [TIMESPEC] 인자 : date, seconds, ns
$ date --rfc-3339='date'
2017-01-01
$ date --rfc-3339='second'
2017-01-01 00:00:00+09:00
$ date --rfc-3339='ns'
2017-01-01 00:00:00.000000000+09:00
UTC 표준 규격 출력 (--utc)
# UTC(세계협정시)로 출력 (-u, --utc, --universal) #
$ date -u
Sun Jan 1 00:00:00 UTC 2017
rdate 명령어
리눅스는 서버로 운영되는 경우가 많은데 서버 시간은 서버에서 동작하는 여러 서비스에 영향을 주게 되기 때문에 항상 정확한 시간 정보를 유지하는 것이 필수이다.
정확한 시간 정보 유지를 위해 타임서버(Time Server)의 시간 정보를 불러와서 기준 시간으로 삼을 수 있는데, rdate 명령어는 리눅스의 시간을 timeserver와 동기화하는 명령어 이다.
rdate 설치
# 우분투
$ apt-get install rdate
# 센토스
$ yum -y install rdate
rdate 사용법
- timeserver 에 시간 서버 주소를 넣어주면 해당 서버와 시간 동기화를 수행하게 된다.
$ rdate -s <timeserver>
시간 서버 목록 (timeserver)
- 현재 사용 가능한 시간 서버 목록이다. 아래 중에 하나의 서버를 선택하여 동기화 해주면 된다.
- time.bora.net
- time.nuri.net
- time.windows.com
- ntp.kornet.net
- time.nist.gov
# time.bora.net 에 시간 동기화
# 정확한 시간을 유지하기 위해 rdate 명령을 정기적으로 실행하고자 한다면, crontab에 등록하면 된다.
$ rdate -s time.bora.net
# 참고 자료
https://pakss328.medium.com/linux-date-%EB%AA%85%EB%A0%B9%EC%96%B4-facd71b06e49
https://blog.azulpintor.io/entry/Linux-date-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%82%AC%EC%9A%A9%EB%B2%95
https://jp-hosting.jp/linux-210808/
이 글이 좋으셨다면 구독 & 좋아요
여러분의 구독과 좋아요는
저자에게 큰 힘이 됩니다.