linux와 sun 에서 시각구할때 서로다른 결과가 나옵니다.

qprk의 이미지

몇일전 날짜를 구하기 위해 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
와같이 동일합니다.

혹시 이런 현상은 어느부분에서 확인해야 하나요?

kslee80의 이미지

혹시 두 머신의 시간이 틀린건 아니신지..? ^^;

P.S.) 커맨드 명령어들의 옵션 중, -- 로 시작하는 옵션들은 GNU 툴들에서만
볼 수 있는 것들입니다. 보통은 기존 Unix 에는 없는 옵션들이 대부분이라..
이 옵션들에 익숙해지면 Unix 쉘 쓰기 힘들어지더군요;;

Prentice의 이미지

좀 딴얘기(?)지만 혹시 GNU date를 설치하는 것은 고려해보셨나요..?

qprk의 이미지

검은해 wrote:
좀 딴얘기(?)지만 혹시 GNU date를 설치하는 것은 고려해보셨나요..?

제 마음대로 설치할 수 있는것이 아니라서 좀 힘드내요..

멋진남자...

doldori의 이미지

혹시 3600초가 차이나지 않던가요? 그렇다면 disp를 초기화하고 해보시죠. 그러니까

struct tm disp = { 0 };

이렇게요. daylight saving time 필드(tm_isdst) 때문에 그럴지도 모릅니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.