문제
계속합니다 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 );
}