关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
本文目录
- 前言
- 转化的思路和对Excel中的错误的处理
- 最终代码
急需代码可以直接跳到最终代码~
前言
近期实现了一个前端导入Excel的需求,然后问题就来了,Excel传来的日期是一串数字(非时间戳)!!!
就比如:2020年10月28日是44132。
根据度娘得知:
Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1。
转化的思路和对Excel中的错误的处理
我一开始的想法是:
因为时间戳是从1970年1月1日算起的(时间戳为0的时候是1970年1月1日)也就是说new Date(0).toLocaleDateString('zh')
的值是1970/1/1
。
而1970年1月1日这一天在Excel中是25569
,那就令从Excel中获取到的值减去25569,然后再乘以24*60*60*1000
获取到这一天的毫秒数,再new Date(这个毫秒数)
就能得到转换后的日期了。
不过刚刚在写这篇博客之前再次测试发现这样写有漏洞…
就是当Excel的值小于61的时候转换的时间跟正常时间相差一天
问题所在的原因:
在Excel中:
- 1是1900年01月01日
- 59是1900年02月28日
- 60是1900年02月29日 1900年是平年,没有这一天!!!错误的原因就是这个
- 61是1900年03月01日
- 62是1900年03月02日
解决办法:既然60之前相差一天 那就做个判断 <60的时候 多减去一天
最终代码
经过解决和我自己测试后的最终代码如下(仅适用于Excel中年月日
日期的转换,不包含时分秒
):
/*** 格式化Excel表中存储的年月日日期* @param {number} num - excel存储的数字* @param {string} [format = '-'] - 年月日的间隔符,默认为'-'* @returns {string} 格式化后的日期*/
function formatExcelDate(num, format = '-') {if (!/^\d+$/.test(num)) returnnum = parseInt(num)let millisecond = 0 // 转化后的毫秒数if (num > 60) { // 对大于60的日期进行减1处理millisecond = (num - 25568 - 1) * 3600 * 24 * 1000} else {millisecond = (num - 25568) * 3600 * 24 * 1000}const date = new Date(millisecond) // 根据转化后的毫秒数获取对应的时间const yy = date.getFullYear()const m = date.getMonth() + 1const mm = m >= 10 ? m : '0' + mconst d = date.getDate()const dd = d >= 10 ? d : '0' + dreturn yy + format + mm + format + dd // 返回格式化后的日期
}
关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。相关推荐
- Maven导入依赖时出现大片的爆红,出现Cannot resolve xxx…,以及Could not transfer artifact xxx错误
Maven依赖无法导入 导入依赖时出现大片的爆红,出现Cannot resolve xxx-,以及Could not transfer artifact xxx错误 1.检查maven设置是否正确 黄 ...
- js将当前时间格式化为年-月-日 时:分:秒
利用js的Date()对象,将系统当前时间格式化为年-月-日 时:分:秒.也可以自己定义格式.(做项目时遇到这个问题.本来想百度一个用,哎,网上的结果太乱了,于是自己写一个) 代码如下: <!D ...
- 数据库显示日期时仅仅显示“年-月-日”的问题
日期时间实际上存放的是年-月-日 时:分:秒,但是仅仅显示了年-月-日,未显示时分秒信息. 解决方法: 工具-首选项-数据库>NLS 日期格式:YYYY-MM-DD HH24:MI:SS,保存后 ...
- java导入excel时去除空行,使用VBA将空行复制到新工作表后删除Excel中的空行
您可以使用 AutoFilter 方法,它将节省您在所有行中使用 For 循环的需要,并且只需将整个过滤范围复制到"Tab 2"工作表 . Code (评论内部评论) Option ...
- java秒转换为年月日_SimpleDateFormat将月/日/年 时分秒转换为年-月-日 时:分:秒
String expirTime = "12 / 27 / 2018 12: 00: 00 AM"; SimpleDateFormat in = new SimpleDateFor ...
- JXL生成EXCEL时单元格设置为数值却展示货币或自定义的问题处理
前言: 以下内容为个人见解,勿喷,欢迎有更好解决方法的大佬指点 问题起源: 最近项目中有一个这样的需求:根据后台数据生成Excel后转存到服务器上供用户进行下载.这本来是一个比较常见的需求,不存在什么 ...
- JS读取Excel时日期格式错误
问题:在做项目的过程中遇到一个问题,导入excel数据时,发现日期的格式错误.预期效果是2022/1/2,导入后的效果却是44563.查阅资料后发现44563表示 1900年1月1号到2022年1月2 ...
- 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...
注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...
- python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案
[问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...
最新文章
- 如何优雅的实现 Spring Boot 接口参数加密解密?
- JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
- matlab 十字路口左转
- English Learning from research paper
- RPLIDAR最强参数详解
- TortoiseSvn执行SVN Commit一直显示Please wait...问题解决
- 独孤密码-非对称加密算法RSA解析
- ClinkHouse基本使用说明
- 【Security】可信网络连接
- 3. MySQL之PyMySQL的安装使用
- yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署
- C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...
- Android辅助工具,G分助手的实现 - 心悦俱乐部app自动签到、领G分
- Xvid 视频压缩编码器设置指南
- iOS Jenkins自动化打包
- ds12c887程序C语言,51单片机驱动DS12C887的时钟芯片C语言程序
- 美团、锤子科技 众多品牌从这里走出
- 计算机教师管理岗位职责,计算机管理教师岗位职责
- js时间戳转化为日期
- 【青少年编程】【Scratch】01 运动模块