ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 시간 처리 함수
    Visual Studio/C 기초 2013. 9. 1. 19:11

    C언어에서 현재 시간을 확인하는 방법이 있는데요, 바로 time()함수를 사용하는 것입니다.

    time_t time(time_t *timeptr); 

    여기서 time_t형은 long형과 같은 성격을 지니고 있고 time.h에 포함되어 있습니다. time() 함수는 1970년 1월 1일 자정 이후에 경과된 초(sec)의 값을 돌려줍니다.

    함수에 NULL 포인터가 아닌 다른 어떤 값을 전달하면 time()은 timeptr이 가리키는 time_t형 변수에 이 값을 저장하게 됩니다.

    그래서 현재 시간을 time_t형 변수 now에 저장하기 위해

    time_t now;

    now = time(0); 

    이렇게 작성할 수 있습니다.

     

    그런데 1970년 1월 1일 이후에 경과된 초의 값으로 표현되는 시간 좀 불편한 감이 있는데요, 그래서 C언어에선 time_t값으로 표현되는 시간을 localtime() 함수를 사용하여 tm 구조체로 변환하는 기능을 제공합니다.

    struct tm *localtime(time_t *ptr); 

    이 함수는 tm형의 static 구조체에 대한 포인터를 돌려주므로 사용되는 tm구조체를 선언할 필요는 없지만 tm형에 대한 포인터를 선언할 필요가 있습니다. 이 static 구조체는 localtime()이 호출될 때 마다 다시 사용되고 내용이 대치됩니다.

    만약 반환되는 값을 저장하기 원한다면 프로그램에서는 독립된 tm형 구조체를 선언하고 static 구조체의 값을 복사해야 합니다.

    tm형 구조체에서 time_t형으로 변환하는 동작은 mktime()을 사용하여 수행합니다.

    time_t mktime(struct tm *ntime); 

    이 함수는 1970년 1월 1일 자정 이후에 경과된 초의 값을 돌려주는데 이것은 ntime이 지적하는 tm형 구조체에 의해서 표현되는 시간을 변환한 값입니다.

     

    자 이제, 시간을 출력하기 위해 또 다른 함수를 불러와야 합니다. 바로 ctime()과 asctime()을 사용하는 것입니다. 이 두 개의 함수는 시간을 특정 형식의 문자열로 변환하여 돌려줍니다.

     

     함수 

     전달되는 경로

     함수의 원형 

     ctime()

     시간이 time_t 값으로 전달

     char *ctime(time_t *ptr);

     asctime()

     시간이 tm형 구조체로 전달

     char *asctime(struct tm *ptr);

     

    시간의 출력 형식을 더더욱 자세히 표현하기 위해서는 strftime() 함수를 이용하는 것입니다.

    size_t strftime(char *s, size_t max, char *fmt, struct tm *ptr); 

    함수는 ptr이 가리키는 tm형 구조체에서 시간을 읽어들이고 형식화 문자열 fmt에 따라 형식화하여 결과를 NULL 문자로 종료되는 문자열의 형태로 s가 가리키는 메모리 영역에 저장합니다.

    인수 max는 s에 할당되는 메모리 영역의 양을 지정해야 하고, NULL 문자를 포함하여 결과적으로 생성되는 문자열이 max 이상의 문자를 가진다면 함수는 0을 돌려주고 문자는 무시됩니다. 그렇지 않다면 함수는 저장된 문자의 개수인 strlen(s)를 돌려줍니다.

    strftime()에서 사용될 수 있는 변환 문자 표

    시간 간격을 계산하는 방법이 있습니다. 2개의 time형 값을 계산하여 차이 값을 돌려주는 difftime() 매크로를 사용하면 초 단위의 시간 간격을 계산할 수 있습니다. 

     double difftime(time_t later, time_t earlier);

    later에서 earlier를 빼고 차이 값을 돌려줍니다. 이 값은 두 시간의 초 단위 간격입니다.

    clock() 함수를 사용하면 다른 방법으로 시간 간격을 계산할 수 있는데, 이 함수는 프로그램이 실행된 이후에 경과된 시간을 1/100초 단위로 알려줍니다.

     clock_t clock(void);

     

    이제 예제를 보겠습니다.

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

    main()
    {
     time_t start, finish, now;
     struct tm *ptr;
     char *c, buf1[80];
     double duration;

     start=time(0); // 프로그램이 실행된 시간을 기록합니다.
     time(&now);    // time()을 호출하는 선택적인 방법으로 현재 시간을 기록합니다.
     ptr=localtime(&now);//time_t값을 tm형 구조체로 변환합니다.
     
     c=asctime(ptr);//현재 시간을 가지는 형식화된 문자열을
     puts(c);    //
     getc(stdin);   //생성하고 출력합니다.

     strftime(buf1, 80, "%Y년의 %U번째 주\n", ptr);
     puts(buf1);
     getc(stdin);

     strftime(buf1, 80, "오늘은 %A, %x\n", ptr);
     puts(buf1);
     getc(stdin);

     strftime(buf1, 80, "%I시 %M분", ptr);
     puts(buf1);
     getc(stdin);

     finish=time(0);
     duration=difftime(finish,start);
     printf("이 프로그램의 실행 시간 time() = %f초\n",duration);

     printf("이 프로그램의 실행 시간 clock() = %ld (1/100초)\n",clock());
    }

     

    'Visual Studio > C 기초' 카테고리의 다른 글

    C언어 malloc()  (0) 2013.09.06
    C언어 qsort(), bsearch()  (0) 2013.09.01
    C언어 strftime() 변환 문자 표  (0) 2013.09.01
    C언어 가변적인 함수 va_list, va_start(), va_arg(), va_end()  (6) 2013.08.19
    C언어 void형 포인터  (0) 2013.08.17

    댓글

Designed by Tistory.