提问人:IFThenElse 提问时间:6/18/2022 最后编辑:phuclvIFThenElse 更新时间:6/18/2022 访问量:86
mktime 返回 -1 但数据有效
mktime returns -1 but valid data
问:
我试图找到默认日期的方法(如果日期无效)。 常用方法工作正常:
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 知道我的逻辑炸弹在哪里吗?
答:
6赞
AKX
6/18/2022
#1
mktime
(以及其余的 POSIX 日期函数)仅适用于 >= 1970-01-01 00:00:00 的日期,即 UNIX 纪元。
mktime
,引用手册,
如果无法将时间表示为time_t对象,则返回 -1
而 1900 年绝对不能代表为time_t,因为它早了 70 年。
评论
1赞
phuclv
6/18/2022
GNU C 库还保证 time_t 是有符号类型,并且它的所有函数都对负time_t
值正确运行,负值被解释
为纪元之前的时间。所以如果你使用 GNU libc,那么它应该可以工作
0赞
IFThenElse
6/18/2022
好吧,这个 1971 年(mktime 只接受 1971 年)的魔法是未知的。在 Windows 上,它很常见 1900。谢谢你的提示。
评论
KTime::Set
绝对不是 C,然后你可以在这里不是一个有效的函数。但是在 C++ 中为什么不直接使用 ?set
std::chrono
std::chrono