在 Linux 内核源码中时间转换是最基础也最高频的操作之一。今天拆解一个极简但极精巧的函数——__month_to_secs它把月份直接映射成从年初到该月1日的秒数。函数原型int __month_to_secs(int month, int is_leap)month0~110 代表 1 月is_leap是否闰年0 或 1返回值从 1 月 1 日 00:00:00 到month月 1 日 00:00:00 经过的秒数核心一张表搞定所有月份static const int secs_through_month[] { 0, 31*86400, 59*86400, 90*86400, 120*86400, 151*86400, 181*86400, 212*86400, 243*86400, 273*86400, 304*86400, 334*86400 };这张表存储的是每个月1日之前累计经过的秒数。我们来验证几个值month含义累计天数秒数01月1日0012月1日311月31×8640023月1日31285959×8640034月1日3128319090×86400............1112月1日334334×86400注意这是平年的数据2 月按 28 天算。闰年修正一行 if 解决int t secs_through_month[month]; if (is_leap month 2) t 86400; return t;闰年多出的 2 月 29 日影响的是3 月及以后的所有月份。所以判断条件是month 2即 3 月、4 月……12 月补上一天的秒数86400。为什么不建两张表平年/闰年因为一张表 一次分支判断比两张表更省空间。现代 CPU 分支预测准确率极高这个 if 几乎零代价。为什么用static constconst数据放在只读段.rodata不占用栈空间static保证只初始化一次函数多次调用不重复计算编译器会把31*86400这类表达式直接折成立即数运行时就是一次内存读取性能对比方案时间复杂度空间评价逐月累加循环O(month)O(1)慢不可取双表法平年/闰年O(1)2×48B快但浪费空间本方案单表ifO(1)48B最优解实际使用场景这个函数在 Linux 内核中被__tm_to_time等时间转换函数调用用于将struct tm年/月/日/时/分/秒转换为时间戳秒数。总结要点说明查表O(1) 拿到基础秒数闰年修正month 2时 86400月份范围0~1101月返回值该月1日 0点的秒数非月末一行代码的智慧用空间换时间用一次判断换一张表。如果这篇拆解对你有帮助点个赞再走 参考Linux kernel source, time/time.c