日付パターンを別の日付パターン、特に特定の日付と比較するスマートな方法を探しています。私が使用しなければならない日付パターンには、コンパクトな形式で 4 つのメンバーがあります。
first octet year
0 .. 254 = 1900 .. 2154
255 = any year
second octet month
1 .. 12 = January .. December
13 = odd months
14 = even months
255 = any month
third octet day of month
1 .. 31 = day of month
32 = last day of month
33 = odd days of month
34 = even days of month
255 = any day of month
fourth octet day of week
1 .. 7 = Monday .. Sunday
255 = any day of week
日付パターンは 32 ビット整数で格納できるので、ビットマスクなどを使用して比較することを考えました。コード例は、現在使用する予定の inchoate クラスを示しています。しかし、「賢さ」はありません。すべての有用なヒントに感謝します!
#include <time.h>
class DatePattern
{
private:
int year;
int month;
int dayOfMonth;
int dayOfWeek;
public:
DatePattern(int year, int month, int dayOfMonth, int dayOfWeek)
{
// validate year
if (year < 1900 || year > 2154)
{
year = 255;
}
this->year = year;
// validate month
if (month < 1 || month > 14)
{
month = 255;
}
this->month = month;
// validate day of month
if (dayOfMonth < 1 || dayOfMonth > 34)
{
dayOfMonth = 255;
}
this->dayOfMonth = dayOfMonth;
// validate day of week
if (dayOfWeek < 1 || dayOfWeek > 7)
{
dayOfWeek = 255;
}
this->dayOfWeek = dayOfWeek;
}
bool Match(struct tm * timeinfo)
{
// validate time pointer
if (timeinfo == NULL)
{
time_t rawtime;
time(&rawtime);
timeinfo = localtime(&rawtime);
}
// check year
if (year != 255 && timeinfo->tm_year != year)
{
return false;
}
// check month
int currentMonth = timeinfo->tm_mon + 1;
bool oddMonth = (currentMonth % 2 ? true : false);
if (month != 255 && (month == 13 && !oddMonth) && (month == 14 && oddMonth) && month != currentMonth)
{
return false;
}
// check day of month
bool oddDay = (timeinfo->tm_mday % 2 ? true : false);
if (dayOfMonth != 255 && (dayOfMonth == 33 && !oddDay) && (dayOfMonth == 34 && oddDay) && dayOfMonth != timeinfo->tm_mday)
{
return false;
}
// check day of week
int currentDayOfWeek = (timeinfo->tm_wday == 0 ? 7 : timeinfo->tm_wday);
if (dayOfWeek != 255 && dayOfWeek != currentDayOfWeek)
{
return false;
}
return true;
}
long Compact()
{
return (((year - 1900) << 24) | (month << 16) | (dayOfMonth << 8) | (dayOfWeek));
}
int Year()
{
return year;
}
int Month()
{
return month;
}
int DayOfMonth()
{
return dayOfMonth;
}
int DayOfWeek()
{
return dayOfWeek;
}
};
int main ()
{
DatePattern pattern(-1, 6, -1, 2); // every Tuesday in June
bool result = pattern.Match(NULL);
return 0;
}
だから私の質問は、日付を日付パターンと比較するより良い方法を知っている人はいますか? 同様の方法で日付パターンを操作するライブラリまたは既知の実装は既にありますか?