本文目录

  • 前言
  • 转化的思路和对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日期存在的错误的分析和处理。相关推荐

  1. Maven导入依赖时出现大片的爆红,出现Cannot resolve xxx…,以及Could not transfer artifact xxx错误

    Maven依赖无法导入 导入依赖时出现大片的爆红,出现Cannot resolve xxx-,以及Could not transfer artifact xxx错误 1.检查maven设置是否正确 黄 ...

  2. js将当前时间格式化为年-月-日 时:分:秒

    利用js的Date()对象,将系统当前时间格式化为年-月-日 时:分:秒.也可以自己定义格式.(做项目时遇到这个问题.本来想百度一个用,哎,网上的结果太乱了,于是自己写一个) 代码如下: <!D ...

  3. 数据库显示日期时仅仅显示“年-月-日”的问题

    日期时间实际上存放的是年-月-日 时:分:秒,但是仅仅显示了年-月-日,未显示时分秒信息. 解决方法: 工具-首选项-数据库>NLS 日期格式:YYYY-MM-DD HH24:MI:SS,保存后 ...

  4. java导入excel时去除空行,使用VBA将空行复制到新工作表后删除Excel中的空行

    您可以使用 AutoFilter 方法,它将节省您在所有行中使用 For 循环的需要,并且只需将整个过滤范围复制到"Tab 2"工作表 . Code (评论内部评论) Option ...

  5. java秒转换为年月日_SimpleDateFormat将月/日/年 时分秒转换为年-月-日 时:分:秒

    String expirTime = "12 / 27 / 2018 12: 00: 00 AM"; SimpleDateFormat in = new SimpleDateFor ...

  6. JXL生成EXCEL时单元格设置为数值却展示货币或自定义的问题处理

    前言: 以下内容为个人见解,勿喷,欢迎有更好解决方法的大佬指点 问题起源: 最近项目中有一个这样的需求:根据后台数据生成Excel后转存到服务器上供用户进行下载.这本来是一个比较常见的需求,不存在什么 ...

  7. JS读取Excel时日期格式错误

    问题:在做项目的过程中遇到一个问题,导入excel数据时,发现日期的格式错误.预期效果是2022/1/2,导入后的效果却是44563.查阅资料后发现44563表示 1900年1月1号到2022年1月2 ...

  8. 从Excel中导入数据时,提示“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”的解决办法...

    注意,64位系统,用64位的补丁文件; https://www.cnblogs.com/A2008A/articles/2438962.html 操作系统:使用的是64位的Windows Server ...

  9. python将EXCEL数据导入数据库时日期型数据变成数字并加.0的问题一行代码解决方案方案

    [问题描述]:python将EXCEL数据导入数据库时日期变成文本型数据并显示为数字格式 [解决方案] 数据源: codes: #!/usr/bin/python3 -- coding: utf-8 ...

最新文章

  1. 如何优雅的实现 Spring Boot 接口参数加密解密?
  2. JZOJ 4786. 【NOIP2016提高A组模拟9.17】小a的强迫症
  3. matlab 十字路口左转
  4. English Learning from research paper
  5. RPLIDAR最强参数详解
  6. TortoiseSvn执行SVN Commit一直显示Please wait...问题解决
  7. 独孤密码-非对称加密算法RSA解析
  8. ClinkHouse基本使用说明
  9. 【Security】可信网络连接
  10. 3. MySQL之PyMySQL的安装使用
  11. yolov5-5.0训练模型+瑞芯微rv1126上实现模型部署
  12. C++设计模式 | 四种创建型模式——简单工厂模式、工厂方法模式、抽象工厂模式、单例模式...
  13. Android辅助工具,G分助手的实现 - 心悦俱乐部app自动签到、领G分
  14. Xvid 视频压缩编码器设置指南
  15. iOS Jenkins自动化打包
  16. ds12c887程序C语言,51单片机驱动DS12C887的时钟芯片C语言程序
  17. 美团、锤子科技 众多品牌从这里走出
  18. 计算机教师管理岗位职责,计算机管理教师岗位职责
  19. js时间戳转化为日期
  20. 【青少年编程】【Scratch】01 运动模块

热门文章

  1. 抖音测试年龄和年级的是什么软件,抖音年龄测试相机app
  2. macbook 打开以后没有声音,重启以后又好了的解决方法
  3. A+B 输入输出练习VIII
  4. PHP 实现网页爬虫
  5. android 系统隐藏和显示虚拟按键的几种方法
  6. 化工原理计算机辅助设计,化工原理课程设计心得体会
  7. 美女图片采集器 源码+解析
  8. 微软office在线文档_如何使用Microsoft Office密码保护文档和PDF
  9. jadx卡死解决方案
  10. 算法(arithmetic)