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

为何获取当前时间的C++算法中使用数值2472632而非1721119?

关于C++时间转换代码中kDaysFromUnixTime常量的疑问与解析

问题背景

在一段自定义的C++时间转换代码中,对kDaysFromUnixTime常量的数值2472632存在疑惑。原本认为该值应该是Unix纪元(1970-01-01)到公元0年1月1日的天数偏移量1721119,但替换后代码输出错误时间。

原代码

Get_Now(
    const char* fmt = "%Y-%m-%d %H:%M:%S",
    int time_zone = 8)
{
        std::time_t unix_sec = std::time(nullptr);
        std::tm tm;
        static const int kHoursInDay = 24;
        static const int kMinutesInHour = 60;
        static const int kDaysFromUnixTime = 2472632;
        static const int kDaysFromYear = 153;
        static const int kDMagicUnkonwnFirst = 146097;
        static const int kMagicUnkonwnSec = 1461;
        tm.tm_sec = unix_sec %kMinutesInHour;
        int i = (unix_sec / kMinutesInHour);
        tm.tm_min = i % kMinutesInHour;
        i /= kMinutesInHour;
        tm.tm_hour = (i + time_zone) % kHoursInDay;
        tm.tm_mday = (i + time_zone) / kHoursInDay;
        int a = tm.tm_mday + kDaysFromUnixTime;
        int b = (a * 4 + 3) / kDMagicUnkonwnFirst;
        int c = (-b * kDMagicUnkonwnFirst) / 4 + a;
        int d = ((c * 4 + 3) / kMagicUnkonwnSec);
        int e = -d * kMagicUnkonwnSec;
        e = e /4 + c;
        int m = (5 * e + 2) / kDaysFromYear;
        tm.tm_mday = -(kDaysFromYear * m + 2) / 5 + e + 1;
        tm.tm_mon = (-m / 10) * 12 + m +2;
        tm.tm_year = b * 100 + d - 6700 + (m / 10);
        stringstream ss;
        ss << std::put_time(&tm, fmt);
        return ss.str();// #include <iomanip>
}

替换前后输出对比

// 替换前(kDaysFromUnixTime=2472632)输出:
2025-03-15 10:53:41;
2025-03-15 10:53:41;
2025-03-15 10:53:41;
2025-03-15 10:53:41;

// 替换后(kDaysFromUnixTime=1721119)输出:
-033-08-19 10:54:22;
-033-08-19 10:54:22;
-033-08-19 10:54:22;
-033-08-19 10:54:22;

解析

1. kDaysFromUnixTime=2472632的推导逻辑

这段代码采用的是**儒略日(Julian Day)**转换算法,kDaysFromUnixTime并非到公元0年的偏移,而是Unix纪元(1970-01-01 UTC)对应的儒略日数,结合算法隐性基准调整后的数值:

  • 1970-01-01对应的标准儒略日是2440588。
  • 代码后续的年月日计算逻辑,是以公元1年3月1日作为隐性基准设计的,2472632是2440588加上算法所需的基准偏移量得到的,目的是让后续整数运算能直接映射到正确的公历年月日字段。

2. 替换为1721119出错的原因

1721119是公历从公元0年1月1日到1970年1月1日的天数,但和这段代码的算法基准不兼容:

  • 代码中的魔法数(kDMagicUnkonwnFirst=146097是400年的天数,对应公历闰年规则;kMagicUnkonwnSec=1461是4年的天数)都是针对儒略日或调整后的公历基准设计的,和公元0年的基准完全不匹配。
  • 替换后,a = tm.tm_mday + 1721119会让后续的整数除法运算完全偏离算法预期的映射关系,最终计算出的年份、月份出现负数,完全不符合公历时间逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:04:58