C 언어에서 주로 사용하는 시간 관련 함수 리스트를 소개하고 간단한 예제를 살펴보자.
# 시간 관련 함수
times(2) : 프로세스의 시간을 구한다.
gettimeofday(3) : 시스템의 현재 시간을 얻는다.
settimeofday(3) : 시스템의 현재 시간을 세팅한다.
ctime(3) : 초 단위로된 시간을 년/달/시간의 문자열로 바꾸어준다.
time(3) : 현재 시간을 초 단위 값으로 구한다. 0:00:00을 1970년 1월 1일
localtime(3) : 초 단위의 시간을 월/일/년으로 변경해준다.
gmtime(3) : 초 단위의 시간을 월/일/년으로 변경해준다.
timelocal(3) : tm 자료 구조를 초로 변경한다.
timegm(3) : tm 자료 구조를 초로 변경한다.
mktime(3) : tm * 를 time_t 자료 구조로 변경한다.
asctime(3) : tm 자료 구조를 이용해서 년/월/일을 갖는 문자열로 변경한다.
strftime(3) : 시간을 다양한 포맷으로 변경한다.
stime(2) : 시스템의 시간을 변경한다. 슈퍼 유저만 사용가능.
# 구조체
struct timeval {
long tv_sec;
long tv_usec;
};
typedef long time_t;
struc tm {
int tm_sec; /* 초 0 - 59 */
int tm_min; /* 분 0 - 59 */
int tm_hour; /* 시간 0 - 23 */
int tm_mday; /* 날짜 1 - 31 */
int tm_mon; /* 달 0 - 11 */
int tm_year; /* 연도 */
int tm_wday; /* 요일 0(일요일) - 6 */
int tm_yday; /* 연중 몇번째 날 0 - 365 */
int tm_isdst; /* 썸머타임제 적용 여부 */
};
1. 현재 시간 값 구하기
# gettimeofday() 함수를 사용
/*
// #include <sys/time.h>
// int gettimeofday(struct timeval *tv, struct timezone *tz);
*/
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main()
{
struct timeval mytime;
// 현재 시간을 얻어온다.
gettimeofday(&mytime, NULL);
printf("%ld:%ld\n", mytime.tv_sec, mytime.tv_usec);
// 시간을 1시간 뒤로 되돌려서 설정한다.
mytime.tv_sec -= 3600;
settimeofday(&mytime, NULL);
return 0;
}
# time() 함수를 사용
/*
// #include <sys/types.h>
// time_t time(time_t *t);
*/
#include <time.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
void swaptime(time_t, char *);
int main()
{
int i;
time_t the_time;
char buffer[255];
// 현재 TIME 을 구한다.
time(&the_time);
printf("현재 시간은 %d 초\n", the_time);
// 보기좋은 지역시간대로 바꾼다.
swaptime(the_time, buffer);
printf("%s\n", buffer);
}
void swaptime(time_t org_time, char *time_str)
{
struct tm *tm_ptr;
tm_ptr = localtime(&org_time);
sprintf(time_str, "%d/%d/%d %d:%d:%d",
tm_ptr->tm_year+1900,
tm_ptr->tm_mon+1,
tm_ptr->tm_mday,
tm_ptr->tm_hour,
tm_ptr->tm_min,
tm_ptr->tm_sec);
}
3. 시스템의 시간을 세팅하기
# settimeofday() 함수를 사용
/*
// #include <sys/time.h>
// int settimeofday(const struct timeval *tv , const struct timezone *tz);
*/
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
int main()
{
struct timeval mytime;
// 현재 시간을 얻어온다.
gettimeofday(&mytime, NULL);
printf("%ld:%ld\n", mytime.tv_sec, mytime.tv_usec);
// 시간을 1시간 뒤로 되돌려서 설정한다.
mytime.tv_sec -= 3600;
settimeofday(&mytime, NULL);
return 0;
}
# stime() 함수를 사용
/*
// #include <unistd.h>
// int stime(const time_t *tp);
*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int main(int argc, char **argv)
{
// 사용법 : ./stime "2002 2 16 9 9 9"
// 년 월 일 시 분 초
char buff[6][5];
struct tm tm_ptr;
time_t m_time;
sscanf(argv[1], "%s %s %s %s %s %s", buff[0], buff[1],
buff[2], buff[3],
buff[4], buff[5]);
tm_ptr.tm_year = atoi(buff[0]) - 1900;
tm_ptr.tm_mon = atoi(buff[1]) - 1;
tm_ptr.tm_mday = atoi(buff[2]);
tm_ptr.tm_hour = atoi(buff[3]);
tm_ptr.tm_min = atoi(buff[4]);
tm_ptr.tm_sec = atoi(buff[5]);
tm_ptr.tm_isdst = 0;
m_time = mktime(&tm_ptr);
stime(&m_time);
}
4. 시간 값을 포맷해서 보여주기
# ctime() 함수를 사용
/*
// #include <time.h>
// char *ctime(const time_t *timep);
*/
#include <time.h>
#include <sys/types.h>
int main()
{
time_t ti = 1023451234;
char *test;
test = ctime(&ti);
printf("%s", test);
}
# localtime() 함수를 사용
/*
// #include <time.h>
// struct tm *localtime(const time_t *timep);
*/
#include <time.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
void swaptime(time_t, char *);
int main()
{
char buffer[255];
time_t the_time;
// time 함수를 이용해서 현재 시간을 얻어온다.
time(&the_time);
memset(buffer, 0x00, 255);
swaptime(the_time, buffer);
printf("%s\n", buffer);
}
void swaptime(time_t org_time, char *time_str)
{
struct tm *tm_ptr;
tm_ptr = localtime(&org_time);
sprintf(time_str, "%d-%d-%d %d:%d:%d", tm_ptr->tm_year+1900,
tm_ptr->tm_mon+1,
tm_ptr->tm_mday,
tm_ptr->tm_hour,
tm_ptr->tm_min,
tm_ptr->tm_sec);
}
# gmtime() 함수를 사용
/*
// #include <time.h>
// struct tm *gmtime(const time_t *time);
*/
int main()
{
int i;
time_t the_time;
struct tm *tm_ptr;
time(&the_time);
tm_ptr = gmtime(&the_time);
printf("현재시간 : %d년 %d월 %d일 %d:%d\n",
tm_ptr->tm_year + 1900, tm_ptr->tm_mon + 1,
tm_ptr->tm_mday, tm_ptr->tm_hour,
tm_ptr->tm_min);
}
# strftime() 함수를 사용
/*
// #include <time.h>
// size_t strftime(char *restrict s, size_t maxsize, const char *restrict format, const struct tm *restrict timeptr);
*/
#include <stdio.h>
#include <time.h>
#define BUFF_SIZE 1204
int main( void)
{
time_t tm_time;
struct tm *st_time;
char buff[BUFF_SIZE];
time( &tm_time);
st_time = localtime( &tm_time);
strftime( buff, BUFF_SIZE, "%Y년 %m월 %d일 - %l시 %M분 %S초 %pn", st_time);
printf( buff);
}
# mktime() 함수를 사용
/*
// #include <time.h>
// time_t mktime(struct tm *timeptr);
*/
#include <stdio.h>
#include <time.h>
int main ()
{
time_t rawtime;
struct tm * timeinfo;
int year, month ,day;
char * weekday[] = { "Sunday", "Monday",
"Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"};
/* 사용자로 부터 날짜를 입력 받는다. */
printf ("Enter year: "); scanf ("%d",&year);
printf ("Enter month: "); scanf ("%d",&month);
printf ("Enter day: "); scanf ("%d",&day);
/* rawtime 에 time 함수로 현재 시간 정보로 세팅한 뒤,
사용자로 부터 입력받은 데이터로 년/월/일 정보를 수정한다. */
time ( &rawtime );
timeinfo = localtime ( &rawtime );
timeinfo->tm_year = year - 1900;
timeinfo->tm_mon = month - 1;
timeinfo->tm_mday = day;
/* mktime 함수를 호출하면 년/월/일 데이터에 따라
tm_wday 와 tm_yday 를 설정한다. 이 때 리턴되는 time_t 데이터는 사용하지 않는다.*/
mktime ( timeinfo );
printf ("That day is a %s.\n", weekday[timeinfo->tm_wday]);
return 0;
}
5. 예제
과제 #1 (작성중..)
오늘의 날짜를 구하는 프로그램을 작성한다.
목적:
1. time 관련 함수와 자료 구조에 익숙해진다.
스펙:
1. 오늘의 날짜와 시간을 구한다.
2. 오늘이 년중 몇일째인가를 구한다.
3. 올해는 앞으로 몇일 남아있는가 알아본다.
과제 #2 (파일첨부 : primeNumber2.c)
1000개의 솟수를 구하는 프로그램을 작성해서 시간을 측정한다.
목적:
1. 알고리즘 선택의 중요성
2. time 관련 함수와 시스템콜 이용.
스펙:
1. 1000개의 솟수를 구해서 출력한다.
2. 솟수를 구하는데 걸리는 시간을 측정한다.
3. 솟수를 구한 후 현재 시간과 일자를 출력한다.