0
날짜 패턴을 다른 날짜 패턴과 물론 특히 특정 날짜와 비교하는 현명한 방법을 찾고 있습니다. 필자가 사용해야하는 날짜 패턴은 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 비트 정수로 저장 될 수 있으므로 비트 마스크를 사용하거나 비교해야 할 사항이 있습니다. 이 코드 예제는 현재 사용할 계획 인 초창기 클래스를 보여줍니다. 그러나 "현명함"이 없다. 모든 유용한 힌트를 위해 나는 감사 할 것입니다!
#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;
}
내 질문은 : 누구든지 날짜 패턴과 날짜를 비교하는 더 좋은 방법을 알고 있습니까? 유사한 방식으로 날짜 패턴을 사용하는 라이브러리 또는 알려진 구현이 이미 있습니까?
무엇이 문제입니까? – Spook
@ Spook 질문을 구체화했습니다. – Daniel
그것은 당신이 필요로하는 비교의 종류에 따라 매우 다릅니다. 당신의 패턴이 어떻게 정의 되었는가에 따라 두 날짜가 짝수 (또는 둘 다 이상한) 개월에있을 때 두 날짜를 더 비슷하다고 간주합니다. 그것은 데이트 유사성에 대한 매우 특별한 개념입니다. 관심이있는 유사성에 대한 모든 기준을 나열한 다음 라이브러리를 찾습니다 (모든 것이 아닐 수도 있습니다). – jogojapan