8-3-나.시간 구조체

time 함수를 사용하면 현재 시간을 쉽게 구할 수 있고 ctime을 사용하면 이 시간을 문자열로도 바꿀 수 있지만 포맷팅을 마음대로 할 수 없어 무척 불편하다. 시간 포맷을 자유롭게 변경하고 싶다면 경과초 형태로 되어 있는 값에서 각각의 시간 요소를 분리해야 한다. 다음 함수들은 time_t형의 값을 tm 구조체로 변환한다.

 

struct tm *gmtime(const time_t *timer);

struct tm *localtime(const time_t *timer);

time_t mktime(struct tm *timeptr);

 

gmtime, localtime 함수는 둘 다 time_t형의 값을 tm 구조체로 변환하는데 gmtime은 세계 표준시로 변환하며 localtime은 지역시간으로 변환한다. 세계 표준시는 잘 사용되지 않으므로 localtime 함수가 훨씬 더 자주 사용된다. 이 두 함수도 라이브러리에 정적으로 할당되어 있는 tm 구조체를 사용하므로 한 함수가 구해 놓은 정보는 다른 함수를 호출하면 파괴된다. mktime 함수는 반대의 변환을 하는데 tm 구조체를 time_t형으로 바꾼다. tm 구조체는 time.h 헤더 파일에 다음과 같이 선언되어 있다.

 

struct tm {

        int tm_sec;     /* seconds after the minute - [0,59] */

        int tm_min;     /* minutes after the hour - [0,59] */

        int tm_hour;    /* hours since midnight - [0,23] */

        int tm_mday;    /* day of the month - [1,31] */

        int tm_mon;     /* months since January - [0,11] */

        int tm_year;    /* years since 1900 */

        int tm_wday;    /* days since Sunday - [0,6] */

        int tm_yday;    /* days since January 1 - [0,365] */

        int tm_isdst;   /* daylight savings time flag */

};

 

날짜와 시간을 구성하는 여러 가지 멤버들이 포함되어 있으며 주석도 비교적 상세하게 작성되어 있다. 각 멤버의 이름이 무척 쉽게 작성되어 있어 따로 외울 필요까지는 없지만 멤버마다 베이스가 제각각이므로 쓸 때는 조금 주의해야 한다.

 

멤버

설명

tm_sec

(0~59)

tm_min

(0~59)

tm_hour

시간(0~23)

tm_mday

날짜(1~31)

tm_mon

(0~11)

tm_year

1990 이후 경과 년수

tm_wday

요일(0~6). 0 일요일

tm_yday

년중 날짜(0~365)

tm_isdst

일광 절약 시간과의

 

다음 예제는 시간을 조사한 후 tm 구조체로 바꾸고 이 구조체의 멤버를 포맷팅하여 출력한다. 이 예제에 사용된 -> 연산자는 구조체 포인터로부터 멤버를 읽는 연산자인데 13장에서 배우게 된다.

 

: tm

#include <Turboc.h>

 

void main()

{

     time_t t;

     tm *pt;

 

     time(&t);

     pt=localtime(&t);

     printf("현재 시간 %d년 %d월 %d일 %d시 %d분 %d초입니다.\n",

          pt->tm_year+1900,pt->tm_mon+1,pt->tm_mday,

          pt->tm_hour,pt->tm_min,pt->tm_sec);;

}

 

시간과 날짜를 구성하는 각 요소가 멤버로 분리되어 있으므로 원하는 바대로 포맷팅해서 출력할 수 있다. 실행 결과는 다음과 같다.

 

현재 시간 2004년 9월 5일 4시 12분 56초입니다.

 

시간 요소 사이에 한글을 넣을 수도 있고 시간 요소의 출력 순서를 마음대로 조정할 수 있어서 훨씬 더 자유롭고 깔끔한 출력을 할 수 있다. asctime 함수는 tm 구조체를 문자열로 바꾸는데 ctime 함수와 마찬가지로 출력 결과가 영어로 되어 있어 한글 환경에는 실용성이 없고 개행 문자도 포함되어 있다.

 

char *asctime(const struct tm *timeptr);

size_t strftime(char *strDest, size_t maxsize, const char *format, const struct tm *timeptr);

 

strftime 함수는 시간을 다양한 방식으로 포맷팅하는데 첫 번째 인수로 버퍼, 두 번째 인수로 버퍼의 길이, 세 번째 인수로 포맷팅 방식, 네 번째 인수로 tm 구조체를 준다. 세 번째 인수에 포맷팅 서식을 어떻게 지정하는가에 따라 시간을 다양한 형식의 문자열로 바꿀 수 있다.

 

: strftime

#include <Turboc.h>

 

void main()

{

     time_t t;

     char Format[128];

 

     time(&t);

     strftime(Format,128,"%Y %B %d %A %I:%M:%S %p",localtime(&t));

     puts(Format);

}

 

실행 결과는 다음과 같다. 출력된 결과를 보면 각 서식의 의미를 알 수 있는데 %Y는 년도, %B는 달의 영문 이름, %d는 날짜이다.

 

2004 September 06 Monday 04:32:52 PM

 

레퍼런스에서 이 함수를 찾아 보면 %로 시작되는 여러 가지 복잡한 서식을 볼 수 있는데 년도를 두 자리로 또는 네 자리로 출력할 수 있고 월의 이름을 길게(January, February) 또는 짧게(Jan, Feb) 출력할 수 있으며 시간도 12시간제/24시간제로 출력할 수 있다. 충분한 포맷팅 서식이 마련되어 있는 것은 사실이지만 모두 영문으로 출력되기 때문에 우리 나라 실정에는 별 도움이 안된다.