JavaScript 将 Excel 日期序列号转为标准日期

概述

Excel 中日期的存储格式为从 1900-01-01 开始的天数序列号(如 44927 = 2023-01-01)。本文介绍如何用 JavaScript 将 Excel 日期数字转为标准日期字符串。

转换函数

function excelTimeToString(excelTime) {
    // 空值处理
    if (!excelTime && excelTime !== 0) {
        return "";
    }

    // Excel 日期基准:1899-12-31 = 0, 1900-01-01 = 1
    var originDate = new Date(1899, 11, 31);  // 月份从0开始,11=12月

    // Excel 天数转毫秒
    var excelTimeInMilliseconds = excelTime * 24 * 60 * 60 * 1000;

    // 计算实际日期
    var convertedDate = new Date(originDate.getTime() + excelTimeInMilliseconds);

    // 格式化
    var year = convertedDate.getFullYear();
    var month = String(convertedDate.getMonth() + 1).padStart(2, "0");
    var day = String(convertedDate.getDate()).padStart(2, "0");

    return year + "-" + month + "-" + day;
}

使用示例

excelTimeToString(44927);  // "2023-01-01"
excelTimeToString(0);      // "1899-12-31"
excelTimeToString(null);   // ""
excelTimeToString(1.5);    // "1900-01-01"(小数表示时间)

带时间的转换

function excelToDateTime(excelTime) {
    if (!excelTime && excelTime !== 0) return "";

    var date = new Date((excelTime - 25569) * 86400 * 1000);
    // 25569 = 1970-01-01 对应的 Excel 序列号
    // 86400 = 一天的秒数

    return date.toISOString();  // "2023-01-01T00:00:00.000Z"
}

重要说明

  • Excel 日期基准:1900-01-01 = 1,1899-12-31 = 0
  • 1900 年闰年 Bug:Excel 错误地将 1900 年当作闰年(实际不是),因此 1900-03-01 之后的日期需要额外减 1
  • 如需处理此 Bug,判断 excelTime > 60 时减 1(第 60 天是虚构的 1900-02-29)
  • 生产环境建议使用 dayjsmoment.js 等成熟库处理

标签: