#include <algorithm>
#include <iostream>
struct SYSTEMTIME
{
int wHour;
int wDayOfWeek;
int wMinute;
} ;
// store a table of the difference in days to account for the
// rollover of days (Saturday/Sunday, Friday/Monday, etc.)
size_t day_difference_table[7][7] =
{
{0, 1, 2, 3, 3, 2, 1},
{1, 0, 1, 2, 3, 3, 2},
{2, 1, 0, 1, 2, 3, 3},
{3, 2, 1, 0, 1, 2, 3},
{3, 3, 2, 1, 0, 1, 2},
{2, 3, 3, 2, 1, 0, 1},
{1, 2, 3, 3, 2, 1, 0}
};
// returns a single size_t value for the difference in times
// by having the days->hours->minutes shifted over 8 bits each
size_t timediff(const SYSTEMTIME& t0, const SYSTEMTIME& t1)
{
// start with an assumption of an absolute match
size_t diff = 0;
// get the absolute value of the difference in the days
// as the day exerts the biggest influence on the result
diff = day_difference_table[t0.wDayOfWeek][t1.wDayOfWeek];
// shift right, since days are "worth more" than hours or minutes...
diff <<= 8;
// then the hours...
diff += std::abs(t0.wHour - t1.wHour);
// shift right, since hours are "worth more" than minutes
diff <<= 8;
// then the minutes
diff += std::abs(t0.wMinute - t1.wMinute);
// nothing left to shift ;)
return diff;
}
int main()
{
SYSTEMTIME m_MatchTime[3];
//current time
m_MatchTime[0].wDayOfWeek = 0;
m_MatchTime[0].wHour = 23;
m_MatchTime[0].wMinute = 59;
// 23:59 from 0
m_MatchTime[1].wDayOfWeek = 0;
m_MatchTime[1].wHour = 0;
m_MatchTime[1].wMinute = 0;
// 0:01 from 0
m_MatchTime[2].wDayOfWeek = 1;
m_MatchTime[2].wHour = 0;
m_MatchTime[2].wMinute = 0;
std::cout << "Difference (23:59 actuallty): " << timediff(m_MatchTime[0], m_MatchTime[1]) << "\n";
std::cout << "Difference: (0:01 actually)" << timediff(m_MatchTime[0], m_MatchTime[2]) << "\n";
}
CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KCnN0cnVjdCBTWVNURU1USU1FCnsKICAgIGludCB3SG91cjsKICAgIGludCB3RGF5T2ZXZWVrOwogICAgaW50IHdNaW51dGU7Cn0gOwoKLy8gc3RvcmUgYSB0YWJsZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiBkYXlzIHRvIGFjY291bnQgZm9yIHRoZSAKLy8gcm9sbG92ZXIgb2YgZGF5cyAoU2F0dXJkYXkvU3VuZGF5LCBGcmlkYXkvTW9uZGF5LCBldGMuKQpzaXplX3QgZGF5X2RpZmZlcmVuY2VfdGFibGVbN11bN10gPSAKewogICB7MCwgMSwgMiwgMywgMywgMiwgMX0sCiAgIHsxLCAwLCAxLCAyLCAzLCAzLCAyfSwKICAgezIsIDEsIDAsIDEsIDIsIDMsIDN9LAogICB7MywgMiwgMSwgMCwgMSwgMiwgM30sCiAgIHszLCAzLCAyLCAxLCAwLCAxLCAyfSwKICAgezIsIDMsIDMsIDIsIDEsIDAsIDF9LAogICB7MSwgMiwgMywgMywgMiwgMSwgMH0KfTsKCi8vIHJldHVybnMgYSBzaW5nbGUgc2l6ZV90IHZhbHVlIGZvciB0aGUgZGlmZmVyZW5jZSBpbiB0aW1lcwovLyBieSBoYXZpbmcgdGhlIGRheXMtPmhvdXJzLT5taW51dGVzIHNoaWZ0ZWQgb3ZlciA4IGJpdHMgZWFjaCAgICAKc2l6ZV90IHRpbWVkaWZmKGNvbnN0IFNZU1RFTVRJTUUmIHQwLCBjb25zdCBTWVNURU1USU1FJiB0MSkKewogICAvLyBzdGFydCB3aXRoIGFuIGFzc3VtcHRpb24gb2YgYW4gYWJzb2x1dGUgbWF0Y2gKICAgc2l6ZV90IGRpZmYgPSAwOwoKICAgLy8gZ2V0IHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlmZmVyZW5jZSBpbiB0aGUgZGF5cwogICAvLyBhcyB0aGUgZGF5IGV4ZXJ0cyB0aGUgYmlnZ2VzdCBpbmZsdWVuY2Ugb24gdGhlIHJlc3VsdAogICBkaWZmID0gZGF5X2RpZmZlcmVuY2VfdGFibGVbdDAud0RheU9mV2Vla11bdDEud0RheU9mV2Vla107CgogICAvLyBzaGlmdCByaWdodCwgc2luY2UgZGF5cyBhcmUgIndvcnRoIG1vcmUiIHRoYW4gaG91cnMgb3IgbWludXRlcy4uLgogICBkaWZmIDw8PSA4OwoKICAgLy8gdGhlbiB0aGUgaG91cnMuLi4KICAgZGlmZiArPSBzdGQ6OmFicyh0MC53SG91ciAtIHQxLndIb3VyKTsKCiAgIC8vIHNoaWZ0IHJpZ2h0LCBzaW5jZSBob3VycyBhcmUgIndvcnRoIG1vcmUiIHRoYW4gbWludXRlcwogICBkaWZmIDw8PSA4OwoKICAgLy8gdGhlbiB0aGUgbWludXRlcwogICBkaWZmICs9IHN0ZDo6YWJzKHQwLndNaW51dGUgLSB0MS53TWludXRlKTsKCiAgIC8vIG5vdGhpbmcgbGVmdCB0byBzaGlmdCA7KQoKICAgcmV0dXJuIGRpZmY7Cn0KCgoKaW50IG1haW4oKQp7CiAgIFNZU1RFTVRJTUUgbV9NYXRjaFRpbWVbM107CgogICAvL2N1cnJlbnQgdGltZQogICBtX01hdGNoVGltZVswXS53RGF5T2ZXZWVrID0gMDsKICAgbV9NYXRjaFRpbWVbMF0ud0hvdXIgPSAyMzsKICAgbV9NYXRjaFRpbWVbMF0ud01pbnV0ZSA9IDU5OwoKICAgLy8gMjM6NTkgZnJvbSAwCiAgIG1fTWF0Y2hUaW1lWzFdLndEYXlPZldlZWsgPSAwOwogICBtX01hdGNoVGltZVsxXS53SG91ciA9IDA7CiAgIG1fTWF0Y2hUaW1lWzFdLndNaW51dGUgPSAwOwoKICAgIC8vIDA6MDEgZnJvbSAwCiAgICBtX01hdGNoVGltZVsyXS53RGF5T2ZXZWVrID0gMTsKICAgIG1fTWF0Y2hUaW1lWzJdLndIb3VyID0gMDsKICAgIG1fTWF0Y2hUaW1lWzJdLndNaW51dGUgPSAwOwoKICAgc3RkOjpjb3V0IDw8ICJEaWZmZXJlbmNlICgyMzo1OSBhY3R1YWxsdHkpOiAiIDw8IHRpbWVkaWZmKG1fTWF0Y2hUaW1lWzBdLCBtX01hdGNoVGltZVsxXSkgPDwgIlxuIjsKICAgc3RkOjpjb3V0IDw8ICJEaWZmZXJlbmNlOiAoMDowMSBhY3R1YWxseSkiIDw8IHRpbWVkaWZmKG1fTWF0Y2hUaW1lWzBdLCBtX01hdGNoVGltZVsyXSkgPDwgIlxuIjsKfQo=