본문 바로가기

UNIX_LINUX_C_C++

UNIX Time Stamp

출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article/unixtime

UNIX Time Stamp

무엇에든 시작이 있게 마련고 시간도 시작이 있다.
이를테면 "서기", "단기" 와 같은 것들인데, 특정 인물이 태어난 시간을
기준으로 잡아서 시간을 계산하는 것등이다.
반면 Unix 시스템에서 기준으로 사용하는 때는 1970년 1월 1일(GMT)을 기준으로
한다. 이때를 기준으로 해서 지금까지 흐른시간을 초 단위로 측정한다.
유닉스에서 시간측정을 위해서 사용하는 가장 기본적인 함수인 time(2) 역시
시간을 초로 환산하여 돌려준다.
#include <time.h>#include <stdio.h>#include <unistd.h>int main(){    int       i;    time_t  the_time;    time(&the_time);    printf("현재시간은 %d\n", the_time);}
위의 코드를 컴파일 하여서 실행하면 현재시간을 초로 환산하여 돌려준다.
당신의 시스템 시간이 표준시와 비슷하다면 대충 10억 얼마 정도를 돌려줄것이다. time 함수의 원형은 다음과 같다.

비록 time(2)오래된 역사를 가진 표준적인 함수 이긴 하지만, 단지 시간을 초 단위에서 만 얻을 수 있다는 단점을 가진다. 이를 테면 정밀도가 떨어진다고 볼 수 있다. 그래서 최근에는 gettimeofday(2)를 time(2)대신 사용하고 있다.
#include <time.h>  time_t time(time_t *tp)  

time 함수가 매우 유용하긴 하지만, 지금 시간은 1970 년부터 "1012902900" 초가
흐른 시간입니다.. 라고 말한다면 아마도 지금의 시간을 아는데 상당한 어려움을
겪에 될것이다.
해서 인간이 보기 좋은 형식으로 만들어줘야 하는데, gmtime(3) 함수를 사용한다.
#include <time.h> struct tm *gmtime(const time_t *timep);  
gmtime 의 아규먼트로 현재시간(초 단위의)을 넣어주면 tm 구조체의 값을
채워서 돌려준다. tm 구조체에는 다음과 같이 선언되어 있다.
struct tm {         int     tm_sec;         /* 초 (0-59) */         int     tm_min;         /* 분 (0-59) */         int     tm_hour;        /* 시 (0-23) */         int     tm_mday;        /* 일 (1-31) */         int     tm_mon;         /* 월 (0-11) */         int     tm_year;        /* 년 (1900 기준) */         int     tm_wday;        /* 요일 (0-6) */         int     tm_yday;        /* 일 (0-365) */         int     tm_isdst;       /* 일광절약 시간 적용여부 */ };  

예제

아래는 예제이다.
#include <time.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main(){    int       i;    time_t  the_time;    struct    tm *tm_ptr;    time(&the_time);    tm_ptr = gmtime(&the_time);    printf("현재시간 : %d년 %d월 %d일 %d:%d\n",            tm_ptr->tm_year + 1900, tm_ptr->tm_mon +1,            tm_ptr->tm_mday, tm_ptr->tm_hour,            tm_ptr->tm_min);}

그런데 위의 코드를 컴파일해서 실행시켜보면 값이 현재 시간과 약간 다르게 나올것이다. 아마 지금 현재 시간 보다"9시간" 느리게 나올것이다. 이유는 gmtime 이 GMT 기준의 표준시를 돌려주기 때문이다. 우리나라는 GMT 를 기준으롸 봤을때 +9 의 시간을 가진다. 자신이 가지고 있는 시스템의 timezone 을 알아보기 위해서는 "echo $TZ" 을
이용하면 된다.

자기 지역의 시간을 알아보기 위해서는 localtime(3) 을 사용해야 한다. 사용방법
은 gmtime 과 완전히 똑같음으로 별도로 예를 들지는 않겠다.
그냥 위의 코드에서 gmtime 만 localtime 로 바꿔치기 하면 된다.

그 반대의 경우도 생각할수 있을것이다.
즉 "년,월,일,시,분,초" 가 주어졌을때 이를 Unix 시간으로 바꿔줄 경우이다.
실제로 이런 요구는 프로그래밍시 자주 발생한다.
이럴때는 mktime(3) 을 사용하면 된다.
#include <time.h>#include <stdio.h>#include <unistd.h>#include <sys/types.h>int main(){    struct tm tm_ptr;    time_t the_time;    int i;    tm_ptr.tm_year = 102;    tm_ptr.tm_mon  = 1;    tm_ptr.tm_mday = 8;    tm_ptr.tm_hour = 23;    tm_ptr.tm_min  = 50;    tm_ptr.tm_sec  = 50;    tm_ptr.tm_isdst = 0;    printf("%d\n", mktime(&tm_ptr));}
이외에도 localtime(3), ctime(3), asctime(3)등의 관련함수들도 있으니 확인해 보기 바란다.

시스템 시간 설정

시간을 가져오는 것 만큼 컴퓨터의 시간을 설정하는 것 역시 중요하다. 컴퓨터의 시간 설정을 위해서 유닉스는 stime(2)와 settimeofday(2)를 제공한다. stime()은 settimeofday()의 오래된 버젼이다. 컴퓨터 시스템을 직접 제어할 수 있어야 하므로 반드시 root권한을 가지고 있어야만 실행 가능하다. 이들 함수에 대한 자세한 내용은 위의 함수 링크를 참고하기 바란다.

시간 응용

이들 유닉스 시간관련 함수들은 내부분 저수준이거나, 고수준의 함수라 할지라도 출력결과가 마땅치 않을 때가 있다. 예를 들어 "oo년 oo일 oo:oo:oo"이런 식으로 시간을 나타내려고 하면 상당히 귀찮은 코딩 과정을 거쳐야 한다. 코드모음의 time2str을 참고하기 바란다. 필자가 나름대로 작성한 시간출력 함수가 설명되어 있다.

이상으로 유닉스에서 시간을 다루는 함수와 사용방법에 대해 간단히 설명해 보았다.
많은 도움이 되었길 바라며, 다음번엔 좀더 나은 내용으로 찾아올걸 약속?
드립니다. ;) 그럼 빠이~~

'UNIX_LINUX_C_C++' 카테고리의 다른 글

메시지 큐  (0) 2011.11.12
메시지 큐 사용법  (2) 2011.11.12
UNIX 시간 함수에 대한 설명  (0) 2011.11.09
TCP/IP 에서 Blocking socket vs. Nonblocking socket  (0) 2011.11.08
BeeJ`s Guide to Network Programming  (0) 2011.10.17