如何将年积日转换为对应日期?C++中如何用mktime()实现?
年积日转日期的实现方案
1. 年积日365对应日期的说明
年积日(Day of Year, DOY)是从每年1月1日开始计数的天数:
- 平年(365天)的第365天直接对应12月31日
- 闰年(366天)的第365天对应12月30日,第366天才是12月31日
无需手动硬编码映射,借助C++标准库可自动适配平/闰年场景。
2. 用C++标准库mktime()实现天数转日期
mktime()函数会自动解析并调整tm结构体的日期字段,无需自行编写闰年判断、月份天数计算等算法,具体实现如下:
核心思路
- 初始化
tm结构体,设置目标年份(注意tm_year是年份与1900的差值)、月份为1月(tm_mon从0开始计数)、天数为目标年积日 - 调用
mktime(),函数会自动处理日期溢出(比如1月365天会自动进位到12月的对应日期) - 从调整后的
tm结构体中读取最终的年、月、日
示例代码
#include <iostream> #include <ctime> #include <iomanip> int main() { const int target_year = 2023; // 平年示例,可替换为目标年份 const int day_of_year = 365; std::tm date_info{}; // 设置年份:tm_year = 年份 - 1900 date_info.tm_year = target_year - 1900; // 设置为1月(tm_mon范围0-11) date_info.tm_mon = 0; // 设置年积日 date_info.tm_mday = day_of_year; // 固定为中午12点,避免时区导致的日期偏移问题 date_info.tm_hour = 12; // 调用mktime自动校准日期 if (std::mktime(&date_info) != -1) { std::cout << "年积日 " << day_of_year << " 对应日期:" << std::setw(4) << (date_info.tm_year + 1900) << "-" << std::setw(2) << std::setfill('0') << (date_info.tm_mon + 1) << "-" << std::setw(2) << std::setfill('0') << date_info.tm_mday << "\n"; } else { std::cerr << "日期转换失败:无效的年积日或年份\n"; } return 0; }
代码说明
tm_year:必须传入年份 - 1900,例如2023年对应2023-1900=123tm_mon:设置为0代表1月,mktime会从1月开始累加天数,自动推导正确月份tm_hour = 12:避免时区差异导致日期被往前/往后推一天(比如午夜时间可能被时区转换为前一天)- 执行后,
date_info会被自动更新为正确的年、月、日:平年365天输出2023-12-31,闰年(如2024年)365天输出2024-12-30
内容的提问来源于stack exchange,提问作者rob
相关产品推荐
相关产品推荐

