2013-06-04 2 views
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; 
} 

내 질문은 : 누구든지 날짜 패턴과 날짜를 비교하는 더 좋은 방법을 알고 있습니까? 유사한 방식으로 날짜 패턴을 사용하는 라이브러리 또는 알려진 구현이 이미 있습니까?

+1

무엇이 문제입니까? – Spook

+0

@ Spook 질문을 구체화했습니다. – Daniel

+0

그것은 당신이 필요로하는 비교의 종류에 따라 매우 다릅니다. 당신의 패턴이 어떻게 정의 되었는가에 따라 두 날짜가 짝수 (또는 둘 다 이상한) 개월에있을 때 두 날짜를 더 비슷하다고 간주합니다. 그것은 데이트 유사성에 대한 매우 특별한 개념입니다. 관심이있는 유사성에 대한 모든 기준을 나열한 다음 라이브러리를 찾습니다 (모든 것이 아닐 수도 있습니다). – jogojapan

답변

1

이는 내가 그것을 할 것입니다 방법 :

  • 가 값 1..31, 32, 33, 34, 그것의 본질에 대한 255 정보를 저장 (실제 일 또는 규칙을) 받아들이는 클래스의 날을 만들기 ;
  • 오버로드 == 규칙에 따라 다른 요일과 비교할 수있는 요일 클래스의 연산자입니다.
  • 비슷한 방식으로 DayOfWeek, Month, Year 클래스를 구현합니다.
  • DayOfWeek, Day, Month, Year를 집계하고 특정 날짜 (d/m/y) 또는 "인코딩 된 날짜"로 구성 할 수있는 구현 클래스 Date;
  • Date 클래스의 오버로드 == 연산자로 Day, DayOfWeek, Month 및 Year 부분을 비교하여 Date를 다른 Date와 비교할 수 있습니다.