mktime()的奇怪行为

Aus*_*yde 1 c++ date mktime

继续我尝试创建一个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;
}
Run Code Online (Sandbox Code Playgroud)

对于任意日期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;
Run Code Online (Sandbox Code Playgroud)

翻译日期为1969年12月31日晚上11:00:00.

我可以验证是否mktime()有责任,因为通过评论该行,它会正确地报告日期和时间为1970年1月1日12:00:00 am.

为什么mktime()只搞乱这个时代?我该如何解决/解决这个问题?

谢谢!

Mic*_*urr 5

你传递0作为day参数并将其放入time.tm_mday.该组件(并且仅该组件)struct tm是基于1的,而不是基于0的.

不要问我为什么.

要指定1970年1月1日上午12:00:00,您可以这样称呼它:

processComponents(0,1,1970,0,0,0);
Run Code Online (Sandbox Code Playgroud)

正如sdtom所提到的,你要确保tm_isdst设置得恰当 - 0表示无效,正表示有效,负表示你不知道(在这种情况下mktime()应该尝试猜测).

只是为了让您知道,当我将您拥有的日期(1970年1月0日,00:00:00)传递给mktime()MSVC 9时,它会返回一个错误(传入的struct tm是未触及的,返回的time_t值为-1).