문제

계속합니다 DateTime 클래스를 만들려고 시도합니다 , 나는 내 기능에 "epoch"시간을 저장하려고합니다.

void DateTime::processComponents(int month, int day, int year, 
                                 int hour, int minute, int second) {
    struct tm time;
    time.tm_hour = hour;
    time.tm_min = minute;
    time.tm_sec = second;
    time.tm_mday = day;
    time.tm_mon = month;
    time.tm_year = year - 1900;
    ticks_ = mktime(&time);

    processTm(time);
}

void DateTime::processTm(struct tm time) {
    second_ = time.tm_sec;
    minute_ = time.tm_min;
    hour_ = time.tm_hour;
    weekday_ = time.tm_wday;
    monthday_ = time.tm_mday;
    yearday_ = time.tm_yday;
    month_ = time.tm_mon;
    year_ = time.tm_year + 1900;
}

임의의 날짜는 processComponents(5,5,1990,1,23,45) (1990 년 6 월 6 일 오전 1:23:45), 모든 값을 올바르게 설정하고 예상대로 설정합니다.

그러나 추가 테스트를 통해 processComponents(0,0,1970,0,0,0) (1970 년 1 월 1 일, 오전 12:00:00), mktime(&time) 원인 time 나사로 :

time.tm_mon  = 11;
time.tm_mday = 30;
time.tm_year = 69;
time.tm_hour = 23;
time.tm_min  = 0;
time.tm_sec  = 0;

time.tm_isdst  = 0;
time.tm_gmtoff = -18000;
time.tm_zone   = "EST";
time.tm_wday   = 2;
time.tm_yday   = 363;

1969 년 12 월 31 일 날짜로 번역 오후 11:00:00.

나는 그것을 확인할 수있다 mktime() 그 라인을 언급함으로써 1970 년 1 월 1 일 오전 1 월 1 일 오전 1 월 1 일 오전에 날짜와 시간을 정확하게보고하기 때문에 책임이 있습니다.

mktime() 시대 만 엉망이 되나요? 그리고 이것을 어떻게 수정 / 해결해야합니까?

감사!

도움이 되었습니까?

해결책

당신은 0으로 0을 통과합니다 day 매개 변수와 그것을 넣습니다 time.tm_mday. 해당 구성 요소 (및 해당 구성 요소) struct tm 0 기반이 아닌 1 기반입니다.

이유를 묻지 마세요.

1970 년 1 월 1 일, 오전 12:00:00을 지정하려면 그렇게 부르고 싶습니다.

processComponents(0,1,1970,0,0,0);

그리고 AS SDTOM이 언급했습니다, 당신은 그것을 확인하고 싶을 것입니다 tm_isdst 적절하게 설정됩니다 - 사실상 0, 사실상 긍정적이며, 음수는 알지 못합니다 (어떤 경우에는 mktime() 추측하려고 노력해야합니다).

당신이 가진 날짜를 통과 할 때 (1970 년 1 월 0 일, 00:00:00) mktime() MSVC 9에서는 오류를 반환합니다 (통과 된 struct tm 손대지 않고 반환됩니다 time_t 값은 -1)입니다.

다른 팁

1 시간 씩 꺼져 있기 때문에 일광 절약 시간이 예상됩니다. 시간의 가치가 어딘가에 설정되고 있습니까? 설정하지 않으면 무작위로 1 또는 0으로 설정되어 결과에 영향을 줄 수 있습니다.

모든 0을 전달합니다 mktime() "Sun Jan 0 00:00:00 1900"으로 해석됩니다. 이를 바탕으로 조정이 필요합니다 ...

// the input is local time
// the output is seconds since the epoch
// The epoch is Jan 1, 1970 @ 0:00 GMT
time_t mktime_wrapper( int month, int day, int year,
                       int hour=0, int min=0, int sec=0, bool isDST=-1
                     )
   {
   tm t;
   t.tm_sec=sec, t.tm_min=min, t.tm_hour=hour, t.tm_isdst=isDST;
   t.tm_mday=day, t.tm_mon=month-1, t.tm_year=year-1900;
   return mktime( &t );
   }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top