Excel 序列日期 / OADate 是从 1899-12-30 起算的天数,小数部分表示当天的时间。它的源纪元和单位必须跟着一起走——光看数字,你没法知道它属于哪块钟。
换算公式
Unix 毫秒 = (序列值 − 25569) × 86400000
转换器按这个关系给出 Unix 秒、epoch 毫秒、ISO 8601 UTC 和可读的 UTC 值。排查日志或导出数据时,请把原始值也留着,方便日后复核换算是否正确。
容易出错的地方
Excel 序列日期是日历值,不是 Unix 时间戳。尤其要留意那个为兼容而保留的 1900 闰年怪癖。
更稳妥的做法
- 动手算之前,先确认平台和字段名。
- 数值可能超出 JavaScript 安全整数范围时,用字符串保留原始值。
- 在边界上一次性转换完,之后只存储和比较单位明确的 Unix 值。
- 只有在把结果呈现给人看时,才用具名时区做格式化。
相关格式转换器
Frequent questions:
- Q: 怎么把 Excel 序列日期转成 Unix 时间戳?
- A: 减去 25,569(1899-12-30 到 1970-01-01 之间的天数),再乘以 86,400,就得到 Unix 秒。
- Q: OADate 是什么?
- A: OLE 自动化日期是一个从 1899 年 12 月 30 日起算的浮点天数,被 .NET(DateTime.ToOADate)和 COM 使用。对所有现代日期,它和 Excel 序列日期是一致的。
- Q: Excel 的偏移量为什么是 25569 而不是 25568?
- A: 因为 Excel 的 1900 闰年 bug 凭空插入了一个 1900 年 2 月 29 日,导致其后的任何日期都多算了一天,于是 25,569 才是现代日期的正确偏移。