본문 바로가기
프로그래밍/C

__DATE__ 에서 필요한 정보를 추출하여 원하는 포맷으로 출력하기

by eteo 2024. 4. 17.



__DATE__, __TIME__ 은 ANSI/ISO 표준으로 정의되고 C 컴파일러 전처리기가 제공하는 특수한 매크로로 소스파일이 컴파일 시점의 날짜와 시간 정보를 나타내는 문자열 리터럴이다.

 

 

 

보통 __TIME__ 의 경우는 우리가 자주 사용하는 형태와 동일하기 때문에 따로 손댈게 없다.

 



 

 

하지만 __DATE__ 의 경우 월, 일, 년도 순이고 월은 영문에 일은 한자리 수 인경우 앞이 공백이여서 그대로 쓰기엔 애매하다.



 

 

 

따라서 __DATE__를 원하는 형태의 formatted string으로 출력하기 위해 다음의 두가지 방법이 있다.

 

 

 

 

 

첫번째 방법

 

yyyy-mm-dd 로 출력하고자 하는 경우 해당 digit Character를 추출해서 조합하는 형태

 

#include <stdio.h>

#define BUILD_YEAR_CH0      (__DATE__[ 7])
#define BUILD_YEAR_CH1      (__DATE__[ 8])
#define BUILD_YEAR_CH2      (__DATE__[ 9])
#define BUILD_YEAR_CH3      (__DATE__[10])
#define BUILD_MONTH_IS_JAN  (__DATE__[0] == 'J' && __DATE__[1] == 'a' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_FEB  (__DATE__[0] == 'F')
#define BUILD_MONTH_IS_MAR  (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'r')
#define BUILD_MONTH_IS_APR  (__DATE__[0] == 'A' && __DATE__[1] == 'p')
#define BUILD_MONTH_IS_MAY  (__DATE__[0] == 'M' && __DATE__[1] == 'a' && __DATE__[2] == 'y')
#define BUILD_MONTH_IS_JUN  (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'n')
#define BUILD_MONTH_IS_JUL  (__DATE__[0] == 'J' && __DATE__[1] == 'u' && __DATE__[2] == 'l')
#define BUILD_MONTH_IS_AUG  (__DATE__[0] == 'A' && __DATE__[1] == 'u')
#define BUILD_MONTH_IS_SEP  (__DATE__[0] == 'S')
#define BUILD_MONTH_IS_OCT  (__DATE__[0] == 'O')
#define BUILD_MONTH_IS_NOV  (__DATE__[0] == 'N')
#define BUILD_MONTH_IS_DEC  (__DATE__[0] == 'D')
#define BUILD_MONTH_CH0     ((BUILD_MONTH_IS_OCT || BUILD_MONTH_IS_NOV || BUILD_MONTH_IS_DEC) ? '1' : '0')
#define BUILD_MONTH_CH1     ((BUILD_MONTH_IS_JAN || BUILD_MONTH_IS_NOV) ? '1' : \
                            (BUILD_MONTH_IS_FEB || BUILD_MONTH_IS_DEC) ? '2' : \
                            (BUILD_MONTH_IS_MAR) ? '3' : \
                            (BUILD_MONTH_IS_APR) ? '4' : \
                            (BUILD_MONTH_IS_MAY) ? '5' : \
                            (BUILD_MONTH_IS_JUN) ? '6' : \
                            (BUILD_MONTH_IS_JUL) ? '7' : \
                            (BUILD_MONTH_IS_AUG) ? '8' : \
                            (BUILD_MONTH_IS_SEP) ? '9' : \
                            (BUILD_MONTH_IS_OCT) ? '0' : '?')
#define BUILD_DAY_CH0   ((__DATE__[4] >= '0') ? (__DATE__[4]) : '0')
#define BUILD_DAY_CH1   (__DATE__[ 5])

const char compiledDate[] = { BUILD_YEAR_CH0, BUILD_YEAR_CH1, BUILD_YEAR_CH2, BUILD_YEAR_CH3, '-',
							BUILD_MONTH_CH0, BUILD_MONTH_CH1, '-',
							BUILD_DAY_CH0, BUILD_DAY_CH1 };

int main(void) {
	printf("Compiled Date: %s\n", compiledDate);
	return 0;
}

 

 

 

 

 

 

두번째 방법

 

년, 월, 일을 정수형태로 얻어내고 printf의 서식지정자를 통해 원하는 형태로 출력하는 형태

 

#include <stdio.h>

#define BUILD_YEAR	(__DATE__[7] - '0') * 1000 + (__DATE__[8] - '0') * 100 + (__DATE__[9] - '0') * 10 + (__DATE__[10] - '0')
#define BUILD_MONTH	(__DATE__[0] == 'J') ? ((__DATE__[1] == 'a') ? 1 : ((__DATE__[2] == 'n') ? 6 : 7)) \
					: (__DATE__[0] == 'F') ? 2 \
					: (__DATE__[0] == 'M') ? ((__DATE__[2] == 'r') ? 3 : 5) \
					: (__DATE__[0] == 'A') ? ((__DATE__[1] == 'p') ? 4 : 8) \
					: (__DATE__[0] == 'S') ? 9 \
					: (__DATE__[0] == 'O') ? 10 \
					: (__DATE__[0] == 'N') ? 11 \
					: (__DATE__[0] == 'D') ? 12 : 0
#define BUILD_DAY	(__DATE__[4] == ' ') ? (__DATE__[5] - '0') : ((__DATE__[4] - '0') * 10 + (__DATE__[5] - '0'))

int main(void) {
	printf("Compiled Date: %04d-%02d-%02d\n", BUILD_YEAR, BUILD_MONTH, BUILD_DAY);
	return 0;
}

 

 

 

 

 

참고 :

https://stackoverflow.com/questions/17739390/different-format-of-date-macro

https://stackoverflow.com/questions/11697820/how-to-use-date-and-time-predefined-macros-in-as-two-integers-then-stri

https://www.ibm.com/docs/ko/i/7.5?topic=macros-ansiiso-standard-predefined