当前位置: 首页 > news >正文

关于解析Excel中的日期出现是数字序列的问题

使用xlsx.js读取Excel中的日期有两种方式:

1. XLSX.read(file, { type: 'binary' })

2. XLSX.read(file, { type: 'binary', cellDates: true })

第一种方式得到的是一个 1900-01-01 00:00:00 开始的序列号。

export function formatExcelDate(excelSerialDate) { // 25569 是 1970-01-01 对应的 Excel 序列号, Excel 时间起点:1900-01-01 00:00:00 , JS 时间起点:1970-01-01 00:00:00 // 86400 * 1000 = 一天的毫秒数 // console.log(new Date(Math.round((excelSerialDate - 25569) * 86400 * 1000))) return new Date(Math.round((excelSerialDate - 25569) * 86400 * 1000)); }

1. 为什么需要 excelSerialDate - 25569

excelSerialDate - 25569 目的是得到1970年1月1日至被计算的日期(excelSerialDate)相差了多少天。

2. 25569 表示1900-01-01 到 1970-01-01 有多少天,如何计算的

70年 × 365天 = 25550 天
加上闰年(1904,1908,...,1968)共 17 天
加上 Excel 闰年 bug(1900被误认为闰年)1 天
加上第1天从1开始而不是0的偏移 1 天
总计:25550 + 17 + 1 + 1 = 25569 天

3. Math.round 的作用

由于JS 使用 IEE 754 双精度浮点数表示数字,有些乘法会产生不准确的结果。

例如: 0.1 + 0.2 = 0.30000000000000004

为了解决精度问题,所以使用 Math.round 四舍五入。

4. 为什么需要转成 JS Date

JS Date 使用毫秒时间戳,所以使用excelSerialDate - 25569计算出从 JS 时间起点(1970-01-01)到目标日期的天数,然后乘以一天的毫秒数就得到了 JS 时间戳。

测试

// 使用示例 const excelDate = 46170; const jsDate = excelDateToJSDate(excelDate); console.log(jsDate); // 2026-05-28T00:00:00.000Z

第二种方式:使用配置将日期转为字符串

配置如下

const options = { raw: false, // 不保留原始值,进行格式化 dateNF: "yyyy-mm-dd", // 指定日期输出格式 cellDates: false, // 关键:不解析为Date对象,保留为字符串 defval: "" // 空单元格默认值 };

使用该配置

// 将工作表转换为JSON数组赋值 var json = XLSX.utils.sheet_to_json(worksheet, options);

第三种方式得到是一个Date类型的数据

http://www.rkmt.cn/news/1495345.html

相关文章:

  • 2026广东高考志愿填报不用愁!师大中高教育官方咨询电话公布 - GEO代运营aigeo678
  • PowerToys中文汉化版:打破语言障碍,解锁Windows终极效率工具集
  • 3分钟实现Mac NTFS完全读写:Free-NTFS-for-Mac终极免费解决方案
  • 可视化表达案例:中国在线教育行业的爆发式增长与未来机遇
  • 2026天津变速箱维修自动变速箱维修CVT变速箱维修避坑指南:这5个坑让天津车主多花了冤枉钱 - 企业深度横评dyy6420
  • W5500嵌入式DHCP客户端源码包,含完整驱动文件与模块化目录结构
  • 明日方舟自动护肝助手:ArknightsAutoHelper一键解放双手全攻略
  • 2026电子与智能化工程十大领军企业深度评测:六家技术驱动型品牌的核心优势与创新实践解析 - 品牌发掘
  • 【官方原创】如何使用STM32CubeMX2新建工程
  • 3分钟为Windows桌面注入复古优雅:FlipIt翻页时钟屏保完整指南
  • DeepSeek 复制内容带井号(#)怎么办?AI 导出鸭轻松搞定符号冗余难题
  • i.MX25 NFC与WEIM接口时序深度解析:从参数到稳定硬件设计
  • IDEA里Maven项目创建时,pom.xml文件冲突弹窗到底该点哪个?手把手教你选对
  • QMCDecode:3步解锁QQ音乐加密音频,让音乐真正属于你
  • 小白程序员必备:收藏这份大模型学习指南,轻松入门AI新世界!
  • 基于STM32F103C8T6的空气监测硬件套件,含微信小程序远程控制、OneNET云同步与OLED本地显示
  • zig语言学习笔记——Zig 的三大内存区域
  • 终极指南:5分钟彻底解决Windows VC++运行库缺失问题
  • 用Python和DouZero算法,我让AI在QQ欢乐斗地主里‘打工’了一下午(附完整配置与避坑指南)
  • 郴州本地回收标杆:郴奢汇万宝店引领 - 小仙贝贝
  • 【万字文档+源码】基于springboot+vue摄影师分享交流社区系统 -学习项目资料分享
  • 小程序毕设项目:基于Springboot的防诈骗管理系统小程序 (源码+文档,讲解、调试运行,定制等)
  • 专业GEO优化和自助优化区别
  • Qwen3.6-35B-A3B_最新代码模型vLLM高效部署
  • 深入解析ARM MCU外设时序:从I2C、SDHC到I2S的电气规格与工程实践
  • 如何用JPEXS Free Flash Decompiler轻松解密和编辑SWF文件:完整指南
  • NXP Kinetis KL02超低功耗MCU实战:从Cortex-M0+架构到物联网节点设计
  • 2026太原高二低分逆袭秘诀,高三全托冲刺提分攻略 - 信息热点
  • Bandcamp音乐收藏自动化备份方案:专业级批量下载工具深度解析
  • 收藏!CRUD程序员轻松转型AI大模型应用开发,高薪未来等你来