mktime 返回 -1 但数据有效

mktime returns -1 but valid data

提问人:IFThenElse 提问时间:6/18/2022 最后编辑:phuclvIFThenElse 更新时间:6/18/2022 访问量:86

问:

我试图找到默认日期的方法(如果日期无效)。 常用方法工作正常:

set(2022,6,17,12,12,0,0,0)

void KTime::Set(int nYear, int nMonth, int nDay, int nHour, int nMin, int nSec, int nDST, bool isUTC)
{
    assert(nYear >= 1900);
    assert(nMonth >= 1 && nMonth <= 12);
    assert(nDay >= 1 && nDay <= 31);
    assert(nHour >= 0 && nHour <= 23);
    assert(nMin >= 0 && nMin <= 59);
    assert(nSec >= 0 && nSec <= 59);

    struct tm atm;
    atm.tm_sec = nSec;
    atm.tm_min = nMin;
    atm.tm_hour = nHour;
    atm.tm_mday = nDay;
    atm.tm_mon = nMonth - 1;        // tm_mon is 0 based
    atm.tm_year = nYear - 1900;     // tm_year is 1900 based
    atm.tm_isdst = nDST;
    m_time = isUTC ? utc_mktime(&atm) : mktime(&atm);

    assert(m_time != -1);       // indicates an illegal input time
}

但是如果我设置为相同的功能:

set(1900,1,1,0,0,0,0,0)

我会得到一个 mktime = -1 知道我的逻辑炸弹在哪里吗?

C++ MKTime

评论

0赞 phuclv 6/18/2022
KTime::Set绝对不是 C,然后你可以在这里不是一个有效的函数。但是在 C++ 中为什么不直接使用 ?setstd::chrono
0赞 IFThenElse 6/18/2022
KTIme 是一个自己的时间处理类。此函数仅用于验证给定日期,而不是填充任何值或参数。
0赞 phuclv 6/18/2022
是的,是用于日期/时间处理的瑞士刀,它包含所有内容,无需求助于古老的 C 工具。代码会短得多std::chrono

答:

6赞 AKX 6/18/2022 #1

mktime(以及其余的 POSIX 日期函数)仅适用于 >= 1970-01-01 00:00:00 的日期,即 UNIX 纪元

mktime引用手册

如果无法将时间表示为time_t对象,则返回 -1

而 1900 年绝对不能代表为time_t,因为它早了 70 年。

评论

0赞 IFThenElse 6/18/2022
好吧,这个 1971 年(mktime 只接受 1971 年)的魔法是未知的。在 Windows 上,它很常见 1900。谢谢你的提示。