为何获取当前时间的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
相关产品推荐
相关产品推荐

