0

我正在寻找一种聪明的方法来将日期模式与另一个日期模式进行比较,当然尤其是与特定日期进行比较。我必须使用的日期模式的紧凑形式有四个成员。

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;
}

所以我的问题是:有人知道将日期与日期模式进行比较的更好方法吗?是否已经存在以类似方式使用日期模式的库或已知实现?

4

1 回答 1

1

我会这样做:

  • 创建 Day 类,它接受值 1..31、32、33、34、255 并存储有关其性质(实际日期或规则)的信息;
  • 在 Day 类上重载 == 运算符,以便可以使用您的规则将其与另一个 Day 进行比较;
  • 以类似的方式实现 DayOfWeek、Month、Year 类;
  • 实现类 Date,它聚合 DayOfWeek、Day、Month、Year,并且可以使用特定日期(d/m/y)或您的“编码”日期构造;
  • 在类 Date 上重载 == 运算符,这样一个 Date 可以通过比较 Day、DayOfWeek、Month 和 Year 部分与另一个 Date 进行比较。
于 2013-06-05T06:03:55.340 回答