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

C++ 不使用任何库如何计算自纪元以来的天数?

解决方案

核心思路

不需要引入任何外部库,直接通过静态查表的方式实现月份天数统计,再按三层累加规则计算总天数即可:

  • 首先定义平年各月份天数的静态常量数组,直接写死固定值,2月固定为28天符合你的要求
  • 总天数按「纪元到上一年年末的总天数 + 当年1月到上一个月末的总天数 + 当月已过天数」三部分累加计算

具体实现

1. 月份天数查表定义

你可以直接在date类内部定义静态常量数组,下标1对应1月,下标0闲置避免月份偏移计算:

// 平年各月份天数,索引0无意义,索引1~12对应1~12月
static const int common_month_days[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

如果想省去月份循环累加的步骤,可以直接用前缀和数组,直接取对应月份的累计天数:

// 平年各月初累计天数,索引0无意义,索引m代表1月到m-1月的总天数
static const int common_month_prefix[] = {0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};

2. 总天数计算实现

以下为C++示例的成员函数实现,默认按Unix纪元(1970年1月1日为起始第0天)计算,你可以根据习题要求修改纪元起始年份:

long long date::days_since_epoch() const {
    const int epoch_year = 1970;
    long long total = 0;

    // 累加纪元到当前年份前一年的所有年份天数
    for (int y = epoch_year; y < year; ++y) {
        total += 365;
    }

    // 累加当年当前月份前的所有月份天数,用前缀和数组的话可以直接替换为 total += common_month_prefix[month];
    for (int m = 1; m < month; ++m) {
        total += common_month_days[m];
    }

    // 累加当月天数,1号算0天则减1,要求算第1天直接加day即可
    total += day - 1;

    return total;
}

注意事项

如果你的习题要求纪元起始为公元1年1月1日,只需要把epoch_year改为1即可,其他逻辑不需要调整。如果后续需要补充闰年支持,只需要在年份累加部分加闰年判断逻辑、月份数组2月改为29即可,现有结构不需要大改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:24:01