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
相关产品推荐
相关产品推荐

