解决Excel导入JS时间转换问题:从序列号到日期的正确算法
在通过js-xlsx等库导入Excel时,日期常被解析为从1900年1月0日起算的序列号数字。由于JavaScript Date对象基于1970年1月1日,直接转换会导致严重偏差。本文详细解析了两种时间基准的差异,提供了包含时区校正和闰年修正的JavaScript转换算法,并展示了处理整数及小数序列号的完整代码示例,确保导入数据的日期格式准确无误。
一、基础
Excel中的日期系统以1900年1月0日为起点,即1900年1月1日对应数值1。
JavaScript的Date对象则以1970年1月1日 08:00:00(本地时区)作为时间戳起点。
Excel时间的换算逻辑如下:

点击常规后变化如下:

二、问题描述
在进行Excel导入操作时,解析得到的日期通常是一个数字序列号,此时必须进行时间格式化转换。
三、解决思路
首先,计算1970年1月1日与1900年1月1日之间的时间差,约为25567天0小时5分钟43秒。
其次,需要减去多算的1天以及8小时的时区偏移。
js代码如下:
let time = new Date((43831-25567) * 24 * 3600000 - 5 * 60 * 1000 - 43 * 1000 - 24 * 3600000 - 8 * 3600000)
let year = time.getFullYear() + ''
console.log('year:'+year)
let month = time.getMonth() + 1 + ''
console.log('month:'+month)
let date = time.getDate() + ''
console.log('data:'+date)

附:js读取excel中日期格式转换问题
在使用js-xlsx插件读取Excel时,类似2018/10/16的数据会被自动转换为48264.12584511这样的数值。
因此,需要手动将其转换回标准的日期格式。
// excel读取2018/01/01这种时间格式是会将它装换成数字类似于46254.1545151415 numb是传过来的整数数字,format是之间间隔的符号
formatDate(numb, format) {
const time = new Date((numb - 1) * 24 * 3600000 + 1)
time.setYear(time.getFullYear() - 70)
const year = time.getFullYear() + ''
const month = time.getMonth() + 1 + ''
const date = time.getDate() - 1 + ''
if (format && format.length === 1) {
return year + format + month + format + date
}
return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
},
console.log(formatDate(42618, '/')) // 2016-9-5
总结
到此这篇关于导入excel时js转换时间的正确方式的文章就介绍到这了,更多相关导入excel时js转换时间内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
为什么叫JavaScript:语言命名由来及与Java的历史渊源
2026-11-05 11:37:48
JS获取当前时间年月日时分秒并格式化为YYYY-MM-DD HH:mm:ss
2026-11-04 21:25:21
不同语言间JS与Java/Python加密结果不一致怎么办
2026-11-04 18:27:23
Mock.js 拦截 Axios 和 Fetch 请求的原理与配置方法
2026-11-04 08:13:59
JS怎么获取当前日期并格式化为YYYY-MM-DD
2026-11-03 18:47:03
