gpt4 book ai didi

c++ - 检查日期是否在部分/周期性日期给出的时间间隔内

转载 作者:行者123 更新时间:2023-12-05 03:17:07 25 4
gpt4 key购买 nike

我可以用 startendYYMMDD 格式定义一个间隔,但它们也可以是部分/周期性的 - 意味着一些元素(日、月或年)可以留空。

例如,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 是否在。

我注意到的一个问题是,如果 startend 颠倒但提供了年份会怎样。例如:isDateInInterval("200105", "190601", "251110") 将是 true

最佳答案

C++20 包含可以表示部分日期的类型:yearmonthdayyear_month , month_day2

例如:

auto start = November/15;
auto end = January/15;

通过使用实际的日历类型,而不是字符串,可以大大简化您必须处理的逻辑。可以将完整的 year_month_day 与一对 month_day 定义的间隔进行比较,如下所示:

bool
compare_partial(std::chrono::month_day start, std::chrono::month_day end,
std::chrono::year_month_day searchDate)
{
using namespace std::chrono;

// Guess that both start and end fall in the same year
auto trial_start = start/searchDate.year();
auto trial_end = end/searchDate.year();
if (trial_start <= trial_end)
{
return trial_start <= searchDate && searchDate <= trial_end;
}

// start/y > end/y
// Otherwise guess that searchDate comes after trail_start:
if (trial_start <= searchDate)
{
// trial_end must be in the next year
trial_end += years{1};
return trial_start <= searchDate && searchDate <= trial_end;
}
// Otherwise searchDate < start/y && start/y > end/y
// trial_start must be in the previous year
trial_start -= years{1};
return trial_start <= searchDate && searchDate <= trial_end;
}

请注意,即使这个答案也有些错误1。但是,通过使用实际的日历类型来执行加/减年等操作以及进行比较,可以使代码更清晰、更易于阅读,从而减少出错的可能性。

此答案也仅针对 month_day 部分日期。您可能还有 year_month 部分日期,或者 month_dayyear_month 的混合。

std::chrono 没有类型 year_day,而且我不确定那是什么意思。如果您知道这意味着什么,我相信 C++20 chrono 可以帮助您建模。

无论如何:

cout << boolalpha << compare_partial(November/15, January/15, 2025y/November/10) << endl;

将输出:

false

即使您不使用 C++20 chrono(或其免费预览版),也强烈建议使用日历类型(可能是您自己创建的)对其进行建模,而不是字符串,以创建健壮的错误-免费解决方案。


1 trial_end += years{1}; 等表达式不能保证是有效日期。例如,如果 trial_end 的值为 2020-02-29 会怎样。再加上一年将为您提供 2021-02-29。要使其正确,您必须决定要如何处理此类情况(例如,将其映射到 2021-02-28?)。


2 C++20 的这一部分还有一个免费的、开源的、仅包含头文件的预览,它适用于 C++11/14/17:https://github.com/HowardHinnant/date

关于c++ - 检查日期是否在部分/周期性日期给出的时间间隔内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74294361/

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