当前位置: 首页 > 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.jsqmd.com/news/983605/

相关文章:

  • 3个技巧彻底解决MPV播放列表管理难题:自动续播与批量操作
  • Python调用C# DLL时,枚举参数传不对?一个value属性帮你搞定(附避坑代码)
  • HS2-HF Patch终极指南:3分钟解锁完整Honey Select 2汉化与去码体验
  • 2026广东高考志愿填报不用愁!师大中高教育官方咨询电话公布 - GEO代运营aigeo678
  • PowerToys中文汉化版:打破语言障碍,解锁Windows终极效率工具集
  • 基于ARM Cortex-M4内核的Kinetis K11低功耗MCU开发实战指南
  • 3分钟实现Mac NTFS完全读写:Free-NTFS-for-Mac终极免费解决方案
  • Kinetis K22F低功耗模式下I2S/SAI时序分析与设计实践
  • i.MX 8ULP异构处理器架构解析与低功耗设计实战
  • 现代 CSS 动画实践:GSAP 与 Framer Motion 的交互设计哲学
  • 可视化表达案例:中国在线教育行业的爆发式增长与未来机遇
  • W5500嵌入式DHCP客户端源码包,含完整驱动文件与模块化目录结构
  • AI 研发团队搭建实战手册:从 0 到 1 组建高效 AI 工程团队
  • 2026天津变速箱维修自动变速箱维修CVT变速箱维修避坑指南:这5个坑让天津车主多花了冤枉钱 - 企业深度横评dyy6420
  • 【官方原创】如何使用STM32CubeMX2新建工程
  • 2026年靠谱的 烟台春季高考培训基地、职教高考学校排行:合规与升学实力对标 - 起跑123
  • 告别丑地图!用ArcGIS给经纬度坐标点做‘美容’的5个实用技巧
  • 2026电子与智能化工程十大领军企业深度评测:六家技术驱动型品牌的核心优势与创新实践解析 - 品牌发掘
  • i.MX 6SLL SSI与UART接口时序详解:从理论到硬件设计实践
  • 【jetson】目标检测快速体验
  • 明日方舟自动护肝助手:ArknightsAutoHelper一键解放双手全攻略
  • 小程序毕设项目:nodejs基于微信小程序印象台院大学资讯新闻设计与实现 (源码+文档,讲解、调试运行,定制等)
  • 苏州油烟管道清洗安装公司排名:六家本土实力服务商的核心优势与2026合作指南 - 品牌发掘
  • Meshroom完全指南:免费开源的3D建模神器从入门到精通
  • 3分钟为Windows桌面注入复古优雅:FlipIt翻页时钟屏保完整指南
  • 夜宵好去处!深夜依旧火爆,湘潭好吃的麻辣烫推荐认准这一家 - 信息热点
  • 别再用Clustal Omega了?聊聊多序列比对的工具选择与实战避坑指南
  • i.MX25 NFC与WEIM接口时序深度解析:从参数到稳定硬件设计
  • IDEA里Maven项目创建时,pom.xml文件冲突弹窗到底该点哪个?手把手教你选对
  • C#零基础通关第二十篇:WinForm桌面项目终极实战,完成从小白到开发者蜕变