我决定实现我自己的 mkgmtime 版本,它比我想象的要容易。
const int SecondsPerMinute = 60;
const int SecondsPerHour = 3600;
const int SecondsPerDay = 86400;
const int DaysOfMonth[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
bool IsLeapYear(short year)
{
if (year % 4 != 0) return false;
if (year % 100 != 0) return true;
return (year % 400) == 0;
}
time_t mkgmtime(short year, short month, short day, short hour, short minute, short second)
{
time_t secs = 0;
for (short y = 1970; y < year; ++y)
secs += (IsLeapYear(y)? 366: 365) * SecondsPerDay;
for (short m = 1; m < month; ++m) {
secs += DaysOfMonth[m - 1] * SecondsPerDay;
if (m == 2 && IsLeapYear(year)) secs += SecondsPerDay;
}
secs += (day - 1) * SecondsPerDay;
secs += hour * SecondsPerHour;
secs += minute * SecondsPerMinute;
secs += second;
return secs;
}
我主要担心的是它mkgmtime
必须与gmtime
. 这样gmtime(mktime(t))
返回原始输入值。因此,我比较了 time_t 的 0 和 MAX_INT 之间所有 61 的倍数的结果,它们确实是相等的(至少在我的系统上)。因此上述程序是正确的。
这个结果也意味着 C 库没有考虑闰秒,这本身就是一件坏事,但对我的目的有好处。这两个功能将长期保持一致。可以肯定的是,使用此函数的 Timestamp 类总是对程序启动执行快速检查,并证明几个有意义的值的一致性。