더북(TheBook)

8.5 시간

시간과 관련된 첫 번째 클래스는 달력에 대한 것이다. 우리가 약속 날짜를 정하거나 생일을 확인하는 데 흔히 사용하는 달력의 표현 범위에 해당하는 시간을 다룬다. 시간과 관련하여 time.h 헤더에서 제공하는 인터페이스는 다음과 같다.

time_t time(time_t *t);
double difftime(time_t time1, time_t time0);
time_t mktime(struct tm tm[1]);
size_t strftime(char s[static 1], size_t max,
                char const format[static 1],
                struct tm const tm[static 1]);
int timespec_get(struct timespec ts[static 1], int base);

time 함수는 현재 시각에 대한 time_t 타입 타임스탬프를 제공한다. 가장 간단한 형식은 time(0)의 리턴 값을 이용하는 것이다. difftime 함수를 이용하면 앞에서 봤듯이 프로그램 실행 중 두 시점의 시간차를 구할 수도 있다.

그럼 사용자 관점에서 이런 함수의 작동 과정을 살펴보자. 잘 알다시피 struct tm 구조체는 우리가 흔히 아는 달력 시간을 표현한다. 연 단위 시각을 표현하는 tm_year부터 시작해서 월 단위 시각을 표현하는 tm_mon, 초 단위에 이르기까지 다양한 데이터 멤버가 계층적으로 구성돼 있다. 그런데 멤버를 세는 방식에 아쉬운 점이 있다. 바로 0부터 시작한다는 점이다. 가령 tm_mon0이면 1월을 의미하고, tm_wday0이면 일요일을 가리킨다. 하지만 다음과 같은 예외가 있다.

tm_mday: 그 달의 첫 날은 1부터 시작한다.

tm_year: 그레고리력(Gregorian calendar) 값을 구하려면 반드시 1900을 더해야 한다. 이런 식으로 표현한 연도는 그레고리력 기준으로 0년과 9999년 사이에 있어야 한다.

tm_sec: 값은 0 이상 60 이하다. 60은 윤초(leap second)를 표현하는 특수한 경우에만 사용한다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.