最简季度判断法为:(month-1)/3,年份直接比较;需注意tm_mon为0–11需+1再算,tm_year需+1900;封装函数same_quarter(y1,m1,y2,m2)应确保m为1–12且不校验日期有效性。

提取年份和季度的最简方式
直接用整数除法算出季度:给定月份 month(1–12),(month - 1) / 3 + 1 就是它所属的季度(1~4)。年份直接取 year。两个日期要同年度同季度,必须同时满足:year1 == year2 且 (month1 - 1) / 3 == (month2 - 1) / 3——注意这里用相等而非季度号相等,可避免整数除法中间结果被误判。
处理具体日期类型时的常见陷阱
如果用 std::chrono::sys_days 或 std::tm,别直接拿 tm_mon(它是 0–11)去套公式。常见错误是写成 tm_mon / 3 + 1,但 tm_mon == 0(一月)时得到 1,没问题;可一旦忘了加 1 再除,或混淆了 tm_year(需加 1900)就全错。
-
tm.tm_year是距 1900 的年数,比较前必须转成实际年份:tm.tm_year + 1900 -
tm.tm_mon是 0–11,季度计算应为tm.tm_mon / 3(整除),无需 ±1 - 若用
std::chrono::year_month_day,ymd.year()返回std::chrono::year,需显式转int:static_cast<int>(ymd.year())</int>
封装成可复用的判断函数
建议写一个内联函数,把解析和比较逻辑收拢,避免每次手动算:
inline bool same_quarter(int y1, int m1, int y2, int m2) {
return y1 == y2 && (m1 - 1) / 3 == (m2 - 1) / 3;
}
传入的月份必须是 1–12。如果输入来自 tm.tm_mon,调用前先做 m = tm.tm_mon + 1。这个函数不校验日期有效性(比如 2 月 30 日),业务层需确保输入是合法日期。
跨年边界和性能提醒
季度判断本身是纯整数运算,零开销。但容易被忽略的是:**“同一季度”不等于“时间间隔 ≤ 3 个月”**。例如 2023-12-31 和 2024-01-01 相差 1 天,却分属 Q4 和 Q1;而 2023-01-01 和 2023-03-31 虽然跨 90 天,仍属同一季度。只要年份不同,就直接返回 false,不必再比月份。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











