gpt4 book ai didi

c++ - 日期模式比较和匹配

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:30:38 28 4
gpt4 key购买 nike

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

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

所以我的问题是:有人知道比较日期和日期模式的更好方法吗?是否已经存在以类似方式处理日期模式的库或已知实现?

最佳答案

我会怎么做:

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

关于c++ - 日期模式比较和匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16916398/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com