[ CAU ] in KIDS 글 쓴 이(By): avec (거리의악사) 날 짜 (Date): 1994년09월07일(수) 22시49분38초 KDT 제 목(Title): 요즘 발견한 bug 요 며칠간 SUN에서 프로그램을 짜면서 발견한 것. 현재의 시간을 읽기 위해서는 보통 time()을 이용한다. time()은 날짜(월,달,일)와 시간(시,분,초)를 한꺼번에 long type(time_t)으로 반환한다. 이 결과로부터 월,달,일,시,분,초를 구분해내기 위해서는 localtime() 함수를 이용해야 한다. 그런데 이 함수들을 실행시켜보니까 다른 것은 `date` 명령을 실행시켰을 때와 동일한 결과를 출력하는데 유독 localtime() 또는 이와 유사한 함수를 이용하면 월이 하나 모자른다. 즉, 오늘이 9월 7일이니까 8월 7일이란 결과가 반환된다. 동일한 입력값(time()의 실행 결과)을 이용하여 ctime()을 실행시키면 정확한 결과가 출력된다. 물론, ctime()의 결과를 이용하여 localtime()을 실행시켜도 월이 하나 모자른다. 내가 내린 결론: 1. localtime()은 사용하지 말자. 2. 라이브러리 함수를 너무 믿지 말자. 3. 가능하면 필요한 함수를 만들어 쓰자. 4. 이런 사실은 만천하에 공표하여 다른 사람에게 널리 알리자. 이 문제를 해결하기 위하여 나는 다음과 같은 방법을 이용하였다. time_t clock; struct tm curtime; char strtime[26]; char *fmt="%a %h %e %T %Y"; clock = time((long *) 0); sprintf(strtime,"%s", ctime(&clock)); strtime[24] = '\0'; /* erase '\n' */ strptime(strtime,fmt,&curtime); /* 여기서 strtime[]의 크기를 26으로 하는 이유는 ctime()의 결과가 "Sun Sep 16 01:03:52 1973\n\0"이기 때문이다. 또한, '\n'을 제거하기 위하여 strtime[24]에 null을 입력한다. */ |