关于js导入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,然后再乘以246060*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中年月日日期的转换,不包含时分秒)

javascript 复制代码
/**
 * 格式化Excel表中存储的年月日日期
 * @param {number} num - excel存储的数字
 * @param {string} [format = '-'] - 年月日的间隔符,默认为'-'
 * @returns {string} 格式化后的日期
 */
function formatExcelDate(num, format = '-') {
  if (!/^\d+$/.test(num)) return
  num = 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() + 1
  const mm = m >= 10 ? m : '0' + m
  const d = date.getDate()
  const dd = d >= 10 ? d : '0' + d
  return yy + format + mm + format + dd // 返回格式化后的日期
}
相关推荐
Sylus_sui几秒前
实现:每行固定 5 个、自动换行、最后一行左对齐、数量不固定
前端·javascript·css
fenglllle10 分钟前
JDK8升级JDK17使用CompletableFuture在线程中classloader的变化
java·开发语言·jvm
froginwe1112 分钟前
Scala 正则表达式
开发语言
时寒的笔记13 分钟前
11期_js逆向核心案例解析(sichuan&某理财网)
开发语言·javascript·ecmascript
csbysj202015 分钟前
PHP 文件:深入解析与最佳实践
开发语言
JAVA面经实录91720 分钟前
Java+SpringAI企业级实战项目完整官方文档(生产终版)
java·开发语言·spring·ai编程
梵得儿SHI20 分钟前
Java IO 流进阶:Buffer 与 Channel 核心概念解析及与传统 IO 的本质区别
java·开发语言·高并发·nio·channel·buffer·提升io效率
j_xxx404_23 分钟前
Linux线程:从内存分页机制(Page Table/TLB/Page Fault)彻底读懂 Linux 线程本质
linux·运维·服务器·开发语言·c++·人工智能·ai
2301_7890156225 分钟前
C++_string增删查改模拟实现
java·开发语言·c++
星河耀银海26 分钟前
JAVA 注解(Annotation):从原理到实战应用
java·开发语言·数据库