XLSX.js解析Excel中的日期格式数据遇到的问题
使用xlsx.js读取Excel中的日期有两种方式:
XLSX.read(file, { type: 'binary' })
XLSX.read(file, { type: 'binary', cellDates: true })
通过第一种方式读取日期,解析结果是Excel中保存的数字(Excel会将日期保存为数字。例如,将2020/09/30由日期格式改成文本格式时,会得到一个44104这样的数字,它代表的是从1900/01/01开始,到该日期的天数。)
拿到这个数字后,通过moment.js对其进行格式转化:
moment('1900/01/01').add(moment.duration({ 'days': 44104 - 1 })).format('YYYY/MM?DD') // => 2020/10/01
然而得到的日期会比实际日期2020/09/30多一天,具体原因是因为在Excel中, 1900年被错误地当成了闰年,1900/02/28后面的日期对应的数字比实际多了1900/02/29这一天。需要在进行特殊处理:
const START_TIME = '1900/01/01' const FORMAT = 'YYYY/MM/DD' export const formatExcelDate = (num) => { let duration = num - 1 // 1900/2/29的num为60 if (num > 60) { // 对于num大于60的需解析日期,要减去多的1900/2/29日的那一天 duration = num - 2 } return moment(START_TIME).add(moment.duration({ 'days': duration })).format(FORMAT) } formatExcelDate(44104) // => 2020/09/30
通过第二种方式读取日期,解析结果是一个日期对象。
一般情况下,对于1901/01/01以前的日期如1900/02/05,会解析为Sun Feb 04 1900 00:05:00 GMT+0805 (中国标准时间)
,对于1901/01/01及以后的日期如2020/05/20,会解析为Tue May 19 2020 23:59:17 GMT+0800 (中国标准时间)
,
可以看到1901/01/01后的解析日期比实际晚了43秒,具体原因未知。还有另外一个问题就是,同一日期在不同电脑上解析的结果不一致,原因暂时未知。
标签:
javascript
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!