关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题

   日期:2020-10-29     浏览:221    评论:0    
核心提示:本文目录前言思路最终代码前言近期实现了一个前端导入Excel的需求,然后问题就来了,Excel传来的日期是一串数字!!!就比如:2020年10月28日是44132。根据度娘得知Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1。思路我一开始的想法是:因为时间戳是从1970年1月1日算起的(时间戳为0的时候是1970年1月1日)也就是说new Date(0).toLocaleDateString('zh')的值是1970/1/1。而19

本文目录

  • 前言
  • 思路
  • 最终代码

急需代码可以直接跳到最终代码~

前言

近期实现了一个前端导入Excel的需求,然后问题就来了,Excel传来的日期是一串数字!!!
就比如:2020年10月28日是44132。根据度娘得知Excel存储的日期是从1900年1月1日开始按天数来计算的,也就是说1900年1月1日在Excel中是1。

思路

我一开始的想法是:

因为时间戳是从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中年月日日期的转换,不包含时分秒):


function formatExcelTime(num, format = '-') { 
	num = Number(num);	// 强制类型转化,以防传来的值是字符串
	let millisecond = 0;	// 转化后的毫秒数
	if (num > 60) { 
		millisecond = (num - 25569) * 60 * 60 * 24 * 1000;
	} else { 
		millisecond = (num - 25568) * 60 * 60 * 24 * 1000;
	}
	let date = new Date(millisecond);	// 根据转化后的毫秒数获取对应的时间
	let yy = date.getFullYear();
	let mm = date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1;
	let dd = date.getDate() < 10 ? '0' + date.getDate() : date.getDate();
	return yy + format + mm + format + dd;	// 返回格式化后的日期
}
 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服