前端XLSX解析Excel数据处理多种日期格式转换问题

devtools/2024/9/23 7:11:49/

一、实现思路

最近在开发一个Excel解析预览的功能,发现在解析Excel导入时间的时候会存在一个离谱的问题就是Excel的时间和XlSX解析之后获取的时间会不一致
例如 2024/6/19 获取的时间为 Wed Jun 19 2024 23:59:17 GMT+0800,少了43秒,为了解决这个问题,需要特别处理一下。

  // 处理包含 "23:59:17" 的日期字符串,转换date类型则加1天,datetime则加43秒if (dateString.includes("23:59:17")) {dateString = dayjs(dateString).add(isDateTime ? 43 : 1, isDateTime ? "second" : "day").format(isDateTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD");}

支持一下多种时间格式转换为标准时间格式"YYYY-MM-DD"或"YYYY-MM-DD HH:mm:ss"
支持转换的时间格式

  • 2019.07.09
  • 2019/07/09
  • 2019年07月09日
  • 44642; // Excel 日期
formatDateString("2023年06月18日 12:30:45", true) 会输出 2023-06-18 12:30:45
formatDateString("2024.06.20", false) 会输出 2024-06-20
formatDateString(44642, true) 会输出 2022-02-14 00:00:00
formatDateString(44642, false) 会输出 2022-02-14

实现代码

import dayjs from "dayjs";const workbook = XLSX.read(data, { type: "array", cellDates: true }); // 使用xlsx库解析Excel文件
/*** 解析日期字符串并返回指定格式的日期。** @param {string|number} dateString - 要解析的日期字符串或 Excel 日期数字。* @param {boolean} isDateTime - 是否需要返回日期和时间格式。* @returns {string} - 格式化后的日期字符串。*/
const formatDateString = (dateString, isDateTime) => {// 帮助函数:将 Date 对象格式化为 yyyy-MM-dd HH:mm:ssconst formatDateTime = date => {return dayjs(date).format("YYYY-MM-DD HH:mm:ss");};// 帮助函数:将 Date 对象格式化为 yyyy-MM-ddconst formatDate = date => {return dayjs(date).format("YYYY-MM-DD");};// 将非字符串的日期转换为字符串if (typeof dateString !== "string") {dateString = String(dateString);}// 处理包含 "23:59:17" 的日期字符串if (dateString.includes("23:59:17")) {dateString = dayjs(dateString).add(isDateTime ? 43 : 1, isDateTime ? "second" : "day").format(isDateTime ? "YYYY-MM-DD HH:mm:ss" : "YYYY-MM-DD");}// 检查日期字符串是否为数字(Excel 日期格式)if (!isNaN(dateString) && !isNaN(parseFloat(dateString))) {const excelDate = parseFloat(dateString);const excelEpoch = new Date(Date.UTC(1899, 11, 30));const dayInMs = 24 * 60 * 60 * 1000;const parsedDate = new Date(excelEpoch.getTime() + excelDate * dayInMs);return isDateTime? formatDateTime(parsedDate): formatDate(parsedDate);}// 处理各种日期格式let date;const chineseDateTimeRegex = /^(\d{4})年(\d{1,2})月(\d{1,2})日 (\d{2}):(\d{2}):(\d{2})$/;const chineseDateRegex = /^(\d{4})年(\d{1,2})月(\d{1,2})日$/;const chineseMatch = dateString.match(chineseDateTimeRegex);const chineseDateMatch = dateString.match(chineseDateRegex);const dotDateRegex = /^(\d{4})\.(\d{1,2})\.(\d{1,2})$/; // 匹配 2024.06.20 格式的正则表达式const dotDateMatch = dateString.match(dotDateRegex);if (chineseMatch) {const [_, year, month, day, hour, minute, second] = chineseMatch;date = new Date(year, month - 1, day, hour, minute, second);} else if (chineseDateMatch) {const [_, year, month, day] = chineseDateMatch;date = new Date(year, month - 1, day);} else if (dotDateMatch) {const [_, year, month, day] = dotDateMatch;date = new Date(year, month - 1, day);} else {const slashDateTimeRegex = /^(\d{4})\/(\d{1,2})\/(\d{1,2})( \d{2}:\d{2}:\d{2})?$/;const slashMatch = dateString.match(slashDateTimeRegex);if (slashMatch) {const [_, year, month, day, time] = slashMatch;date = new Date(`${year}-${month}-${day}T${time ? time.trim() : "00:00:00"}`);} else {date = new Date(dateString);if (!isDateTime) {date.setUTCHours(0, 0, 0, 0);}}}if (isNaN(date.getTime())) {console.error(`Invalid date object: ${dateString}`);return dateString;}return isDateTime ? formatDateTime(date) : formatDate(date);
};

http://www.ppmy.cn/devtools/53716.html

相关文章

tsf consul单独使用,可以在tsf部署不

Consul 是一个开源的工具,用于服务发现和配置。它提供了服务注册与发现、健康检查、键值存储、多数据中心支持等功能。Consul 可以单独使用,也可以与其他系统集成,如与微服务平台 TSF(Tencent Service Framework)结合使…

SpringBoot 多种优雅的线程池配置与使用(异步执行函数,反射机制,动态识别参数,有返回值)

想要明白生活你需要先经历它,而不是总在分析它。 —萨莉鲁尼 文章目录 前言一、@Async注解1. 概念2. 使用2.1 使用@EnableAsync启动函数异步支持2.2 不会异步执行的坑2.2.1 为什么内部调用不会异步执行?2.2.2 如何确保@Async方法异步执行?3. 配置线程池3.1 通过代码配置3.1.…

python 逻辑控制语句、循环语句

文章目录 一、逻辑控制语句(if、elif、else)1.1 单个条件的逻辑判断语句1.2 多个条件的逻辑判断语句 二、循环语句2.1 while 循环2.2 for 循环2.2.1 循环使用 else 语句 一、逻辑控制语句(if、elif、else) Python 条件语句是通过一…

Spring Boot集成 Spring Retry 实现容错重试机制并附源码

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

力扣41 缺失的正数

给你一个未排序的整数数组 nums ,请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1: 输入:nums [1,2,0] 输出:3 解释:范围 [1,2] 中的数字都在数组中…

Vim基础操作:常用命令、安装插件、在VS Code中使用Vim及解决Vim编辑键盘错乱

Vim模式 普通模式(Normal Mode): 这是 Vim 的默认模式,用于执行文本编辑命令,如复制、粘贴、删除等。在此模式下,你可以使用各种 Vim 命令来操作文本。插入模式(Insert Mode)&#…

性能测试(五)—— 数据库性能测试-mysql

1 mysql性能测试的主要内容 MySQL数据库介绍MySQL数据库监控指标MySQL慢查询工作原理及操作SQL的分析与调优方法MySQL索引的概念及作用MySQL索引的工作原理与设计规范MySQL存储引擎MySQL实时监控MySQL集群监控方案MySQL性能测试的用例准备使用Jmeter开发MySQL性能测试脚本执行…

【问题记录】Ubuntu提示: “E: 软件包 gcc 没有可安装候选“

Ubuntu提示: "E: 软件包 gcc 没有可安装候选" 一,问题现象二,问题原因&解决方法 一,问题现象 在虚拟机Ubuntu中进行安装gcc命令时报错:“E: 软件包 gcc 没有可安装候选”: 二,问题原因&解决方法 …