[리눅스 시스템 프로그래밍] 8.5 시간 관련 함수, time, gmtime, localtime, mktime, asctime, ctime, strftime

리눅스 시스템에서 제공하는 기본 타임 서비스는 UTC 1970년 1월 1일 00:00:00로부터 시간을 초(second)단위로 카운트하는 것입니다. 그리고 이 값은 time_t 타입으로 표현하는데 정수 형식이라고 보아도 무관합니다.

리눅스 시스템에서는 기본 타임 서비스에서 카운트한 time_t 값을 반환하는 time 함수를 제공합니다. 이 외에 time_t 형식을 년월일시분초 형태로 분할한 일시(struct tm 형식)로 변환하는 gmtime과 localtime 함수가 있습니다. 또한 struct tm 형식을 time_t 형식으로 변환하는 mktime이 있습니다. 그리고 time_t 형식을 문자열로 변환하는 ctime, struct tm 형식을 문자열 변환하는 asctime, struct tm 형식을 원하는 형태의 문자열로 변환하는 strftime 함수를 제공합니다.

#include <time.h >

time_t time(time_t *cp);

struct tm *gmtime(const time_t *cp);

struct tm *localtime(const time_t *cp);

time_t mktime(struct tm *cp);

char *asctime(const struct tm *tp);

char *ctime(const time_t *cp);

size_t strftime(char *buf, size_t msize, const char *format, const struct tm *tp);

struct tm{

int tm_sec;

int tm_min;

int tm_hour;

int tm_mday;

int tm_mon;

int tm_year;

int tm_wday;

int tm_yday;

int tm_isdst; //summer time

};

포멧, 설명, 예

%a, 간단한 요일, Tue

%A, 완전한 요일, Thesday

%b, 간단한 월, Jan

%B, 완전한 월, January

%c, 날짜와 시각, Tue Jan 20 19:20:24 2017

%d, 월중의 일[01,31], 14

%H, 일중의 시[00,23], 19

%I, 오후/오전 중의 시[00, 12], 09

%j, 년중의 일[001,366], 20

%m, 월[01, 12], 02

%M, 분[00, 59], 20

%P, AM/PM, PM

%S, 초[00, 61], 19

%U, 년중의 주[00,53], 03 (일요일 주수)

%w, 요일[0=일요일, 6], 02

%W, 년중의 주[00,53], 02 (월요일 주수)

%x, 날짜, 01/20/17

%X, 시각, 19:20:24

%y, 년도[00,99], 17

%Y, 년도, 2017

%Z, 시간대, KST

[그림 8.13] 시간 관련 함수와 형식 사이의 관계
[그림 8.13] 시간 관련 함수와 형식 사이의 관계

다음은 time 함수로 현재 카운트 시간(UTC 1970년 1월 1일 00:00:00로부터 흘러간 초)을 구한 후에 이를 지역 시각을 구하기 위해 localtime 함수를 호출하고 다시 이를 문자열로 변환하기 위해 asctime함수를 호출한 후에 현재 시각을 출력하는 예제 코드입니다.

/**********************************************************************
* ex_time.c                                                           *
* exmple source – print now time                                      *
**********************************************************************/
#include <stdio.h>
#include <string.h>
#include <time.h>

int main(void)
{
    time_t now_time;
    struct tm *now_date;
    char buf[100];
    time(&now_time); //현재 시각을 구한다.

    now_date = localtime(&now_time);//초 단위 값을 지역 시각(DateTime)을 구한다.
    strcpy(buf,asctime(now_date));//버퍼에 현재 시각을 출력
    puts(buf);    //표준 출력 스트림에 출력
    return 0;
}
[그림 8.14] ex_time 실행 화면
[그림 8.14] ex_time 실행 화면

 이 외의 다른 시간 관련 함수에 관한 예제는 C언어 표준 라이브러리 함수 가이드(언제나 휴일 출판사, https://ehpub.co.kr)를 참고하세요.