본문 바로가기
놀기/잡스러운 것

__DATE__ and __TIME__ 을 time_t로 변환하기

by Hi~ 2023. 9. 20.

__DATE__ , __TIME__은 자주 쓰는 macro 중의 하나다. 프로그램의 로그 또는 빌드 날짜를 넣을 때 쓰기도 하고 아주 유용하다. 이 유용한 macro를 time_t로 변환해 볼까 하는 생각을 다들 해봤을 것 같다. 이번에 __DATE__, __TIME__을 쓰면서 값을 유지해야 할 일이 있었다. 같은 값을 여러 군데 넣어야 하는데 그냥 macro를 사용하면 차이가 나서 문제가 되는 상황이었다. 그렇다면 방법은 이 값을 저장해야 하는데 그냥 저장하는 것보다 time_t와 같은 형태로 저장하면 유용할 것 같다.

이럴 때 우리가 해야 할 일은 코딩이 아니라 검색 검색 검색.

당연히 많은 예제가 있고 입맛에 맞는 것을 고르면 된다. 

 

compile_time_to_system_time - Function to convert compiler macro __DATE__ and _… | Mbed

 

compile_time_to_system_time - Function to convert compiler macro __DATE__ and _… | Mbed

Function to convert compiler macro __DATE__ and __TIME__ to a system time that can be used to initialize the CPU RTC. I use this to do a 1 time initialization of a RTC chip. Dependents:   xj-Init-clock-to-compile-time-if-not-already-initialized-ds1302 Par

os.mbed.com

 

일단 출력 형태를 확인한다.

$ ./test
__DATE__ : Sep 20 2023
__TIME__ : 14:54:07

 

월을 strstr() 함수로 변화하는 방식은 재미있다. 저런 방법이 있었구나. 역시 다른 사람의 코드를 자주 봐야 한다. 여기서 "%*c"가 쓰이는데 시간 사이의 세미콜론(:) 입력을 무시하게 되어 숫자만 sscanf로 받는다.

time_t cvt_date(char const *date, char const *time)
{
    char s_month[5];
    int year;
    struct tm t;
    static const char month_names[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
    sscanf(date, "%s %d %d", s_month, &t.tm_mday, &year);
    sscanf(time, "%2d %*c %2d %*c %2d", &t.tm_hour, &t.tm_min, &t.tm_sec);
    // Find where is s_month in month_names. Deduce month value.
    t.tm_mon = (strstr(month_names, s_month) - month_names) / 3;    
    t.tm_year = year - 1900;    
    return mktime(&t);
}

 

모를 땐 검색!

알아도 검색!

남는 시간은 독서에 투자!

댓글