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 ビット整数で格納できるので、ビットマスクなどを使用して比較することを考えました。コード例は、現在使用する予定の 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;
}

だから私の質問は、日付を日付パターンと比較するより良い方法を知っている人はいますか? 同様の方法で日付パターンを操作するライブラリまたは既知の実装は既にありますか?

4

1 に答える 1

1

これは私がそれを行う方法です:

  • 値 1..31、32、33、34、255 を受け入れ、その性質 (実際の日またはルール) に関する情報を格納するクラス Day を作成します。
  • ルールを使用して別の Day と比較できるように、クラス Day に == 演算子をオーバーロードします。
  • DayOfWeek、Month、Year クラスを同様の方法で実装します。
  • DayOfWeek、Day、Month、Year を集約し、特定の日付 (d/m/y) または「エンコードされた」日付のいずれかで構築できるクラス Date を実装します。
  • Day、DayOfWeek、Month、および Year の部分を比較することで、ある Date を別の Date と比較できるように、クラス Date で == 演算子をオーバーロードします。
于 2013-06-05T06:03:55.340 に答える