【发布时间】:2022-11-11 01:52:58
【问题描述】:
我可以用start 和end 以YYMMDD 的格式定义一个间隔,但它们也可以是部分/周期性的——这意味着某些元素(日、月或年)可以留空。
例如,start = " 1115" 和end = " 0115" 的时间间隔是每年 11 月 15 日到 1 月 15 日。
我想检查非部分日期是否在间隔内。
int compareParial(const char* first, const char* second)
{
for (int i = 0; i < 6; ++i)
{
if (first[i] != ' ' && second[i] != ' ' && first[i] != second[i])
return first[i] > second[i] ? 1 : -1;
}
return 0;
}
bool isDateInInterval(const char* start, const char* end, const char* searchDate)
{
int firstCompare = compareParial(start, searchDate);
int endCompare = compareParial(end, searchDate);
if (firstCompare <= 0 && endCompare >= 0)
return true;
// the date can still be in the interval if the start of the interval is in one year, but end in the next year
bool switched = 0 < compareParial(start, end);
if (switched && (firstCompare <= 0) != (endCompare >= 0))
return true;
return false;
}
int main()
{
cout << boolalpha << isDateInInterval(" 1115", " 0115", "251110") << endl;
return 0;
}
更新:如果日期颠倒,请再次检查 searchDate 是否在。
我注意到的一个问题是,如果 start 和 end 颠倒了,但提供了年份。例如:isDateInInterval("200105", "190601", "251110") 将是 true
【问题讨论】:
-
调试有什么你完毕?您的函数可以以两种不同的方式返回
true。你确定它的发生方式了吗?这将是调试此问题的第一步。 -
@pcarter 是的,第二种方式。开始 > 结束,但这还不足以说明它在
-
然后下一步是查看
compareParial的for循环,看看当它返回1时i是什么,然后在first和second中对应于索引@987654339 的值是什么@的值。查看代码,似乎是i为 2 时。 -
您的代码假定如果缺少年份,则
start和end的年份相同。 -
@pcarter你是对的,但我不这样做