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 才是现代日期的正确偏移。