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_mon이 0이면 1월을 의미하고, tm_wday이 0이면 일요일을 가리킨다. 하지만 다음과 같은 예외가 있다.
• tm_mday: 그 달의 첫 날은 1부터 시작한다.
• tm_year: 그레고리력(Gregorian calendar) 값을 구하려면 반드시 1900을 더해야 한다. 이런 식으로 표현한 연도는 그레고리력 기준으로 0년과 9999년 사이에 있어야 한다.
• tm_sec: 값은 0 이상 60 이하다. 60은 윤초(leap second)를 표현하는 특수한 경우에만 사용한다.