You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python保存XLS文件后日期变数字,如何用JS转回日期格式?

解决Excel日期序列号转标准日期格式问题

问题原因

你看到的44992是Excel的日期序列号——Excel以1900年1月1日为起始日,用整数表示距离该日期的天数(注意Excel存在1900年闰年bug,错误地包含了不存在的1900年2月29日)。你的Python脚本在处理表格时,没有保留日期格式,导致日期被转成了原始序列号。


方法1:JavaScript中直接转换序列号

以下是直接在JS中将Excel序列号转为mm/dd/yyyy格式的函数,已处理Excel的1900闰年bug:

function excelSerialToDate(excelSerial) {
  // Excel起始日到Unix纪元(1970-01-01)的天数差
  const epochOffset = 25569;
  let days = excelSerial - epochOffset;
  
  // 修正Excel的1900闰年bug:序列号>=60时,实际多算了1天
  if (excelSerial >= 60) {
    days -= 1;
  }

  // 转换为JS Date对象(单位:毫秒)
  const date = new Date(days * 86400000);
  
  // 格式化为mm/dd/yyyy
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const day = String(date.getDate()).padStart(2, '0');
  const year = date.getFullYear();
  
  return `${month}/${day}/${year}`;
}

// 测试:44992对应原日期07/03/2023
console.log(excelSerialToDate(44992)); // 输出 "07/03/2023"

方法2:在Python处理阶段避免日期转序列号

既然问题出在Python修改列名的环节,建议直接在Python读取和保存时保留日期格式,避免后续转换:

import xlrd
from xlutils.copy import copy
from datetime import datetime

# 读取原始表格(保留格式信息)
rb = xlrd.open_workbook("original.xls", formatting_info=True)
wb = copy(rb)
ws = wb.get_sheet(0)  # 获取第一个工作表

# 遍历所有单元格,识别并转换日期
source_sheet = rb.sheet_by_index(0)
for row in range(source_sheet.nrows):
    for col in range(source_sheet.ncols):
        cell = source_sheet.cell(row, col)
        # 判断是否为日期类型单元格
        if cell.ctype == xlrd.XL_CELL_DATE:
            # 转换为datetime对象
            date_val = xlrd.xldate_as_datetime(cell.value, rb.datemode)
            # 格式化为mm/dd/yyyy字符串写入
            ws.write(row, col, date_val.strftime("%m/%d/%Y"))
        else:
            # 非日期单元格直接写入原值
            ws.write(row, col, cell.value)

# 保存修改后的表格
wb.save("modified.xls")

这样处理后,保存的表格中日期会以字符串形式保留mm/dd/yyyy格式,不会出现序列号问题。

内容的提问来源于stack exchange,提问作者Gordon Maloney

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 05:07:50