언어/C언어

[C언어] 시간함수 time, localtime, ctime, asctime

REAKWON 2019. 1. 27. 21:24

시간 관련 함수

프로그램에서 시간은 거의 필수로 다루어질 만큼 중요한 요소입니다. 그래서 우리는 시간을 잘 다루어야 할 필요가 있습니다.  그래서 이번에는 C언어에서 시간과 관련된 함수 몇가지를 살표보도록 하지요. 지금부터 다룰 함수는 모두 시간과 관련된 함수이므로 time.h 헤더파일을 포함시켜야한다는 것을 잊지 마세요.

time

가장 기본적인 시간 관련 함수입니다. 함수의 원형은 다음과 같죠.

#include <time.h>

time_t time(time_t *timeptr);

 

이 함수는 1970년 1월 1일 0시 (UTC)부터 인자값(timeptr)까지 흐른 시간을 반환합니다. 그 단위가 초단위지요.  이 함수의 사용방법은 주로 2가지 입니다.

timeptr이라는 매개변수에 인자를 전달하여 현재까지 흐른 시간을 초단위로 구하거나, time함수에 NULL을 전달하여 반환값을 받거나 입니다.

 

 

 

그래서 현재시간까지 구한다면 time(NULL)을 호출해서 반환값을 받으면 되는 것이죠. 아래의 예처럼요.

time_t t; t = time(NULL); printf("%ld\n", t); 

그 결과는 아래처럼 큰 정수를 반환하게 되지요. 1970년 1월 1일 0시(UTC)부터 지금까지 초단위의 시간을 구하기 때문이지요.

1548588718

 

localtime

이 함수는 지역시간을 구해냅니다. 반환하는 형식은 구조체인데 tm이라는 구조체입니다. 다음 함수의 원형처럼 말이죠.

#include <time.h>

struct tm *localtime(const time_t *timeval);

 

우리는 위의 time함수에서 UTC기준으로 흐른 시간을 초단위로 구했지요. 초단위로 구하니 보기도 어렵고 지금이 몇월인지 몇년도인지 구분하기가 어렵습니다. 그래서 이것을 사람이 잘 알아보게끔 구조체로 변환할 수 있는 함수가 바로 localtime함수입니다.

 

 

 

 

우리는 반환값인 tm구조체를 다는 아니어도 필요한 몇가지 멤버는 알아야할 필요가 있습니다.

struct tm {

        int tm_sec;   //초

        int tm_min;   //분

        int tm_hour;   //시

        int tm_mday;  //일

        int tm_mon;    //월(0부터 시작)

        int tm_year;    //1900년부터 흐른 년

        int tm_wday;  //요일(0부터 일요일)

        int tm_yday;  //현재 년부터 흐른 일수

        int tm_isdst; 

};

필드명은 꽤 직관적입니다. 이 필드명만 보아도 무엇을 의미하는 것인지 잘 알것이라고 생각합니다.

자세한 것은 코드로 살펴보도록 합시다.

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

int main() { 
        time_t current;
        time(&current); 
        struct tm *t = localtime(&current);

        printf("%d년 %d월 %d일 ", 
                        1900 + t->tm_year, t->tm_mon + 1, t->tm_mday); 

        switch (t->tm_wday) {
                case 0:printf("일요일 "); 
                       break;
                case 1:printf("월요일 ");
                       break;
                case 2:printf("화요일 "); 
                       break; 
                case 3:printf("수요일 "); 
                       break;
                case 4:printf("목요일 "); 
                       break; 
                case 5:printf("금요일 ");
                       break;
                case 6:printf("토요일 "); 
                       break;
        } 

        printf("%d:%d:%d\n", t->tm_hour, t->tm_min, t->tm_sec);
        printf("1년 365일 중 %d일째\n", t->tm_yday + 1); 
}

 

그 결과는 다음과 같습니다.

2019년 1월 27일 일요일 20:55:9

1년 365일 중 27일째

각각 년, 월, 일 , 시, 분, 초, 요일을 각각 구할때, 또는 날짜계산, 시간계산을 할때 편리하겠군요.

 

ctime

 

#include <time.h>

char *ctime(const time_t *time);

구조체를 굳이 사용하고 싶지 않고 사용자가 시간을 읽을 수 있게끔 문자열로 변환하는 것이 ctime함수입니다. 마찬가지로 time함수에서 반환된 값을 ctime에 인자로 쏙 집어넣으면 현재 시간 정보를 다음과 같이 보기좋은 형식으로 반환해줍니다.

Www Mmm dd hh:mm:ss yyyy

 

Www 요일을 영어 세글자로 나타냅니다.

Mmm 월을 영어 세글자로 나타냅니다.

dd 날짜를 숫자 두글자로 나타냅니다.

hh 시를 숫자 두글자로 나타냅니다.

mm 분을 숫자 두글자로 나타냅니다.

ss 초를 숫자 두글자로 나타냅니다.

yyyy 년도를 숫자 네글자로 나타냅니다.

 

 

 

 

ctime이 어떤 함수인지 알았으면 어떻게 사용하는지 코드를 보세요. 몇 줄 안되는 코드입니다.

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

int main() { 
        time_t t = time(NULL); 
        printf("현재시간 :%s\n", ctime(&t));
}

 

코드는 상당히 간단합니다. 어떻게 나오는지 살펴보지요.

현재시간 :Sun Jan 27 21:07:50 2019

 

asctime

이 함수는 ctime과 같이 시간을 문자열로 출력해주지만 인자로 tm구조체 포인터를 받는 것과 ctime과 다른게 없습니다.

#include <time.h>

char *asctime(const struct tm *tm);

반환하는 문자열 포맷도 ctime과 똑같습니다. 사용방법은 그저 tm구조체 포인터를 전달하기만 하면 됩니다.

아래의 사용예를 보세요.

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

int main() {
        time_t current = time(NULL);
        struct tm *t = localtime(&current); 
        printf("현재시간 :%s\n", asctime(t));
}
결과는 위의 ctime 결과와 같습니다.
여기까지 시간관련된 함수 4개를 살펴보았는데, 여기까지만 알면 충분할 것 같군요. 나중에 기회가 되면 더 살펴보도록 하지요.
반응형