You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将年积日转换为对应日期?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结构体的日期字段,无需自行编写闰年判断、月份天数计算等算法,具体实现如下:

核心思路

  1. 初始化tm结构体,设置目标年份(注意tm_year是年份与1900的差值)、月份为1月(tm_mon从0开始计数)、天数为目标年积日
  2. 调用mktime(),函数会自动处理日期溢出(比如1月365天会自动进位到12月的对应日期)
  3. 从调整后的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=123
  • tm_mon:设置为0代表1月,mktime会从1月开始累加天数,自动推导正确月份
  • tm_hour = 12:避免时区差异导致日期被往前/往后推一天(比如午夜时间可能被时区转换为前一天)
  • 执行后,date_info会被自动更新为正确的年、月、日:平年365天输出2023-12-31,闰年(如2024年)365天输出2024-12-30

内容的提问来源于stack exchange,提问作者rob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 05:50:11