C 언어 | 고급 기능 | 시간 함수 - time(), localtime()

C 언어의 표준 함수를 사용하여 컴퓨터의 시간을 가져온다. 시간은 단순한 수치로 처리되어 있기 때문에, 날짜로 취급하려면 시스템의 로컬 시간으로 변환해야 한다.

시간을 처리하기

데이터 관리를 할 때, 시간은 중요한 존재이다. 예를 들어 정보가 업데이트 되었을 때는 프로그램 업데이트 로그를 남기는 등의 처리가 요구된다. 많은 시스템에는 시스템 시계가 있기 때문에 이용자에게 “지금의 시간을 입력하라”‘고 묻는다 프로그램은 불친절하다. 프로그램은 지금 날짜를 알고 싶다면, 시스템 시계에서 시간을 산출한다.

현재 시간을 얻거나, 새로 설정하는 프로그램을 만드는 경우 기본적으로 시스템에 문의해야 한다. 시스템이 지원하고 있는 시간 관련 기능을 최대한으로 발휘시키는 경우는 C 언어의 표준 함수에서만 지원할 수 있는 것이 아니기 때문이다. 그러나, 복잡한 API를 사용하지 않아도 시간의 취득이나 변환 등의 기본적인 처리는 표준 함수에서 지원되고 있다.

시간 관련 함수는 time.h 헤더 파일에 선언되어 있다. 시스템 시계에서 시간을 얻으려면 time() 함수를 사용한다.

time() 함수

time_t time( time_t *timer );

timer에는 시스템 시간을 얻는 time_t 형 변수의 포인터를 지정한다. time_t 형은 time.h 헤더 파일에 정의되어 있는 시간을 나타내는 산술형의 typedef 명이다. time_t 형의 실제 형식은 구현에 따라 달라진다. time() 함수는 인수에서 얻은 값과 같은 값을 반환한다. 즉, time () 함수는 시간을 얻는 수단으로 포인터에 간접 참조에서 값을 저장하는 방법 및 반환 값에서 얻는 방법을 선택할 수 있다. 반환 값을 얻는 경우는 인수를 NULL로 해도 상관없다.

이 함수에서 얻을 수 있는 값은 시스템의 부호화된 time_t 형 달력 시간이다. 시간을 얻을 수 없는 경우는 -1을 돌려준다. time() 함수가 반환하는 값은 구현에 의존하기 때문에, 사용하는 시스템의 시간 방식을 확인한다. Microsoft Windows에는 시스템 클럭에 따라 만국 표준시(UCT)의 1970 년 1월 1일 0시 0분 0초부터 경과된 시간을 초단위로 나타내는 숫자를 반환한다.

이대로는 매우 시간이라고는 생각되지 않는듯한 수치가 나타날 뿐이기 때문에(무엇보다, 시스템에 의존하는 시간 처리는 시스템에 의존한 소스를 쓰는 것이 되기 때문), 이를 현재 시간으로 변환해야 한다. 연산에 의해 경과 시간에서 현재 시간을 얻을 수 있지만, localtime() 함수가 이 처리를 수행해 준다.

localtime() 함수

struct tm *localtime( const time_t *timer );

timer에는 변환하는 시간 값에 대한 포인터를 지정한다. 시간은 년/월/일 등의 값을 나타내는 멤버가 있는 tm 구조체에 대한 포인터를 반환한다. tm 구조체는 다음과 같이 선언되어 있다.

tm 구조체

struct tm {
        int tm_sec;   /* 초 - [0~61] (leap second) */
        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; /* 서머 타임이 유효하면 양수, 유효하지 않으면 0, 불명이면 음수*/
};

localtime() 함수는 인수 timer에서 지정된 시간 값을 바탕으로 각 멤버를 적절한 값으로 초기화되어 있는 tm 구조체에 대한 포인터를 반환한다. 이 함수가 반환된 포인터를 이용하면 시간 값에서 사람이 이해할 수 있는 시간을 표시하는 것이 가능하다.

tm 구조체의 월은 0부터 시작되므로, 1월은 0임을 주의한다. 또한 년은 1900년부터 계산된 값이다. 실제 서기로 변환하려면 1900을 추가해야 한다.

코드1

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

int main() {
 struct tm *date;
  const time_t t = time(NULL);
  date = localtime(&t);

 printf(
   "%d/%d/%d %d:%d:%d\n" , date->tm_year + 1900 , date->tm_mon + 1 ,
    date->tm_mday , date->tm_hour , date->tm_min , date->tm_sec
 );

  return 0;
}

코드1은 현재 시간을 표시하는 프로그램이다. 시간은 년/월/일 시:분:초 형태로 표준 출력에 표시된다. 프로그램은 먼저 time() 함수를 사용하여 시스템 시계에서 시간 값을 가져온다. 다음에 localtime() 함수를 사용하여 시간 값을 tm 구조체로 변환한다. 다음은 tm 구조체의 시간을 나타내는 각 멤버에 액세스하여 시간을 표시한다.




최종 수정 : 2017-11-26