独自のバージョンの 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 ライブラリがうるう秒を考慮していないことも意味します。これは、それ自体は悪いことですが、私の目的には適しています。2 つの機能は、長い間一貫したままになります。念のために言うと、この関数を使用するタイムスタンプ クラスは常にプログラムの開始時にクイック チェックを実行し、いくつかの意味のある値の一貫性を証明します。