Easy ways

[C 언어] 현재 시간을 표시하는 방법 [time, ftime, ctime] 본문

프로그래밍 언어/C언어

[C 언어] 현재 시간을 표시하는 방법 [time, ftime, ctime]

softColors 2021. 1. 13. 14:37
반응형

코딩을 하다 보면 현재 시간을 불러와야 할 필요가 생깁니다.

그럴 때는 다음과 같이 코드를 구성해야 합니다.

개발환경 : linux

 

#include <stdio.h>
#include <time.h>

int main(void)
{
    time_t seconds = time(NULL);
    struct tm *now = localtime(&seconds);
    
    printf("[%04d/%02d/%02d] %02d:%02d:%02d\n", 1900 + now->tm_year, 
            now->tm_mon + 1, now->tm_mday, now->tm_hour, 
            now->tm_min, now->tm_sec);
            
	return 0;
}

실행결과

 

time함수는 1970년 1월 1일 0시부터 경과된 현재까지 몇 초 지났는지를 알려줍니다

 

이 초 단위의 시간을 localtime을 통해 년/월/일/시간으로 우리가 알기 쉽게 변환하여 tm 구조체에 담아줍니다.

 

tm 구조체는 다음과 같이 구성되어 있습니다.

struct tm {

        int tm_sec;   //초
        int tm_min;   //분
        int tm_hour;  //시
        int tm_mday;  //일
        int tm_mon;   //월 [0~11]
        int tm_year;  //년 [현재시간 표시시 +1900 필요]
        int tm_wday;  //요일 [0-일요일, 1-월요일, ... ,6-토요일] 
        int tm_yday;  //이번해의 몇번째 일인지
        int tm_isdst; 

};

 

 

msec까지 알고 싶을 때 [ftime, clock_gettime]

 


시간을 상세하게 milli second 단위,, 혹은 더 작은 단위까지도 까지 알아야 할 때가 있습니다.

그럴때는 조금 더 복잡한 방법을 써야합니다

[clock_gettime]

time.h 에 포함되어있는 clock_gettime을 사용하여 현재 시간의 milliseconds 단위까지 확인하는 법은 다음과 같습니다.

#include <stdio.h>
#include <time.h>
#include <math.h>

int main( void) {
    struct timespec specific_time;
    struct tm *now;
    int millsec;
    clock_gettime( CLOCK_REALTIME, &specific_time);
    now = localtime(&specific_time.tv_sec);
    millsec = specific_time.tv_nsec;

    millsec = floor (specific_time.tv_nsec/1.0e6);


    printf("[%04d/%02d/%02d] %02d:%02d:%02d msec : %d\n", 1900 + now->tm_year, 
        now->tm_mon + 1, now->tm_mday, now->tm_hour, 
        now->tm_min, now->tm_sec, millsec);

    return 0;
}


//gcc test.c -lm

실행결과

timespec의 구조는 다음과 같습니다.

struct timespec {
    time_t tv_sec
    long tv_nsec
}

초단위의 사간 뿐만 아니라 nano 단위의 시간까지 표시할 수 있음을 볼 수 있습니다.

하지만 이 nano 시간은 시스템별로 정확도가 보장되지는 않는다고 합니다.

 

저희는 이 nano second를 사용하여 millisecond로 변환시켜줄 겁니다.

floor 를 사용하여 nanosecods 를 milli sencods 로 변환 시켜줍니다.

floor(math.h) 를 사용하기 위해서 컴파일 시에 -m을 사용해야합니다.

 

[ftime]

제가 선호하는 방식은 조금더 단순한 ftime 입니다.

하지만 더 이상 지원되지 않고 향후 GNU 버전에선 삭제될 수 있는 함수입니다.. 

삭제될 때까지는 간단한 함수 짤때는 사용할 수 있습니다.

사용법은 다음과 같습니다.

 

sys/timeb.h 를 불러와서 timeb 구조체 및 ftime 함수를 사용해야 합니다.

sys/timeb.h는 리눅스에서 지원하는 헤더로 윈도에선 사용이 어렵습니다

#include <stdio.h>
#include <time.h>
#include <sys/timeb.h>

int main(void)
{

    struct timeb milli_now;
    struct tm *now;

    ftime(&milli_now);
    now = localtime(&milli_now.time);
    
    printf("[%04d/%02d/%02d] %02d:%02d:%02d (%02dmsec)\n", 1900 + now->tm_year, 
            now->tm_mon + 1, now->tm_mday, now->tm_hour, 
            now->tm_min, now->tm_sec, milli_now.millitm/10);

	return 0;
}

실행결과

 

구조체 timeb는 다음과 같은 구조로 구성되어 있습니다.

struct timeb{

        time_t          time;     // 시간 구조체 (초단위)
        unsigned short  millitm;  // 현재 시간의 milliseconds
        short           timezone; //UTC 시간과 현재 local 시간 차이 표시
        short           dstflag; 

};

 

구조를 보시면 time_t 구조체가 timeb 구조체 안에 들어가 있는 것을 볼 수 있습니다.

조금 더 상위 구조체인 거죠.

또한 millitm을 가지고 있어 현재시간의 milliscond 단위도 표현할 수 있습니다.

 

현재 시간을 문자열로 출력하고 싶을 때 [ctime]


단순하게 시간만 보면 될 때 쓰는 간단한 방식은 다음과 같습니다.

#include <stdio.h>
#include <time.h>

int main(void)
{

    time_t seconds = time(NULL);
    printf("Now :%s\n", ctime(&seconds));

    return 0;
}

실행결과

 

반응형
Comments