linux와 sun 에서 시각구할때 서로다른 결과가 나옵니다.
글쓴이: qprk / 작성시간: 화, 2005/01/04 - 9:53오전
몇일전 날짜를 구하기 위해 date 를 찾다가
linux에서는 date +어쩌구 --date '1 day ago' 라고 하면 되는데 sun에서는 date 에서 그런 기능이 없더군요.. 찾다가 만들어 쓰고만다.. 라는 생각에 아래와 같이 만들었습니다.
그런데 sun과 linux에서 서로 다른 결과를 가지고 옵니다. 동일한 코드와 동일한 컴파일러를 사용했는데도 그런 현상이 발생하내요..
아래와 같은 동일한 코드를 컴파일 하였습니다.
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <signal.h> #include <time.h> #include <sys/stat.h> #include <sys/types.h> time_t get_time(char *, int, int); /*************************************************************************** * ***************************************************************************/ int main(int argc, char *argv[]) { time_t resultTime; struct tm *disp; if(argc != 3){ printf("dateProc yyyymmdd offset\noffset: (-)day\n"); return 0; } resultTime = get_time(argv[1], atoi(argv[2]), 1); disp = localtime(&resultTime); printf("20%02d%02d%02d\n" , ((disp->tm_year > 100)?disp->tm_year-100:disp->tm_year) , disp->tm_mon+1 , disp->tm_mday); return 0; } /*************************************************************************** * date 에서 offset만큼의 날자를 더한다음 초를 리턴 ***************************************************************************/ time_t get_time(char *date, int offset, int job) { time_t sec ; struct tm disp; char yy[10] = {'\0',}; char mm[10] = {'\0',}; char dd[10] = {'\0',}; char hou[10] = {'\0',}; char min[10] = {'\0',}; char se[10] = {'\0',}; yy[0] = date[2]; yy[1] = date[3]; mm[0] = date[4]; mm[1] = date[5]; dd[0] = date[6]; dd[1] = date[7]; if(!job){ hou[0] = date[8]; hou[1] = date[9]; min[0] = date[10]; min[1] = date[11]; se[0] = date[12]; se[1] = date[13]; } /* if(!job){ */ disp.tm_year = atoi(yy); if(disp.tm_year<50) disp.tm_year += 100; disp.tm_mon = (atoi(mm))-1; disp.tm_mday = atoi(dd); if(job){ /* 참이면 날짜만 계산 */ disp.tm_hour = 0; disp.tm_min = 0; disp.tm_sec = 0; }else{ disp.tm_hour = atoi(hou); disp.tm_min = atoi(min); disp.tm_sec = atoi(se); } /* if(job){ */ sec = mktime(&disp); printf("sec->%lu\n",sec); offset = 86400 * offset; return (sec + offset); }
위의 코드를 컴파일 한 다음 sec-> 에 나오는 결과가 서로 다릅니다.
어느 부분이 잘못되었는지 알 수가 없내요..
리눅스에서는 정확한 시각이 나오는데 선에서는 수백초 정도가 차이가 납니다.
컴파일러 정보는
linux : gcc 3.2.2
sun : gcc 3.2.2
와같이 동일합니다.
혹시 이런 현상은 어느부분에서 확인해야 하나요?
Forums:
Re:
혹시 두 머신의 시간이 틀린건 아니신지..? ^^;
P.S.) 커맨드 명령어들의 옵션 중, -- 로 시작하는 옵션들은 GNU 툴들에서만
볼 수 있는 것들입니다. 보통은 기존 Unix 에는 없는 옵션들이 대부분이라..
이 옵션들에 익숙해지면 Unix 쉘 쓰기 힘들어지더군요;;
좀 딴얘기(?)지만 혹시 GNU date를 설치하는 것은 고려해보셨나요.
좀 딴얘기(?)지만 혹시 GNU date를 설치하는 것은 고려해보셨나요..?
[quote="검은해"]좀 딴얘기(?)지만 혹시 GNU date를 설치하
제 마음대로 설치할 수 있는것이 아니라서 좀 힘드내요..
멋진남자...
혹시 3600초가 차이나지 않던가요? 그렇다면 disp를 초기화하고 해보
혹시 3600초가 차이나지 않던가요? 그렇다면 disp를 초기화하고 해보시죠. 그러니까
struct tm disp = { 0 };
이렇게요. daylight saving time 필드(tm_isdst) 때문에 그럴지도 모릅니다.
댓글 달기