C++中是否有处理跨月的明日日期计算函数?
C++处理跨月日期计算的解决方案
你遇到的直接修改tm_mday导致日期无效的问题,C++标准库提供了现成的解决方式,不需要自己编写复杂的进位逻辑,以下是两种可行方案:
方案一:用mktime修正现有代码
localtime返回的tm结构体直接修改日期字段后不会自动调整进位,但mktime函数可以将修改后的tm结构体转换为time_t,同时自动修正所有日期字段(包括跨月、跨年的情况)。
修正后的代码:
#include <string> #include <ctime> std::string get_local_date(const std::string &s) { time_t rawtime; time(&rawtime); // 复制localtime返回的静态结构体,避免后续调用覆盖数据 struct tm tm_copy = *localtime(&rawtime); if (s == "tomorrow") { tm_copy.tm_mday += 1; } if (s == "yesterday") { tm_copy.tm_mday -= 1; } // 关键:调用mktime自动调整日期,处理跨月/跨年 mktime(&tm_copy); char buffer[80]; strftime(buffer, 80, "%04Y-%m-%d", &tm_copy); return std::string(buffer); }
mktime会自动处理所有日期边界情况:比如3月31日加1天会变成4月1日,12月31日加1天会变成次年1月1日,1月1日减1天会变成上年12月31日等。
方案二:C++20及以后用std::chrono日期库
C++20扩展了<chrono>库,提供了类型安全的日期处理工具,year_month_day类型可以直接加减天数,自动处理所有日期进位问题,比传统tm结构体更易用、更安全。
示例代码:
#include <string> #include <chrono> #include <format> std::string get_local_date(const std::string& s) { using namespace std::chrono; // 获取当前本地日期 auto sys_today = floor<days>(system_clock::now()); local_days local_today = sys_days{1970y/January/1} + sys_today.time_since_epoch(); year_month_day ymd{local_today}; if (s == "tomorrow") { ymd += days{1}; } else if (s == "yesterday") { ymd -= days{1}; } // 用std::format格式化日期(替代strftime) return std::format("{:%Y-%m-%d}", ymd); }
总结
- 若使用C++98/11/17,直接用
mktime修正tm结构体即可解决问题,无需自己写进位逻辑; - 若使用C++20及以后,推荐使用
std::chrono的日期类型,代码更简洁、类型更安全。
内容的提问来源于stack exchange,提问作者Tyler
相关产品推荐
相关产品推荐

