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

一、实现思路

最近在开发一个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.mzph.cn/diannao/31486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP PP学习笔记23 - 生产订单(制造指图)的元素2 - 决济规则(结算规则)

上一章讲了生产订单(制造指图)画面的基本元素。 SAP PP学习笔记22 - 生产订单(制造指图)的元素1-CSDN博客 本章继续讲生产订单上面的其他元素。 1,Settlement rule(决济规则(结算规则))概要 M…

springboot容器功能

springboot容器 容器功能Spring注入组件的注解Component,Controller,Service,Repository案例演示 Configuration应用实例传统方式使用Configuration 注意事项和细节 Import应用实例 ConditionalConditional介绍应用实例 ImportResource应用实…

Microsoft Office免费下载安装

文章目录 前言一、下载Office Tool Plus二、部署步骤1.移除本机低版本office2.部署设置3.开始部署 前言 本人一直支持国产WPS(因为正版Microsoft Office需要花钱)。直到某天接触到一款免费部署Microsoft Office的软件——Office Tool Plus,简…

C++ //CCF-CSP计算机软件能力认证 202406-1 矩阵重塑(其一)

CCF-CSP计算机软件能力认证 202406-1 矩阵重塑(其一) 题目背景 矩阵(二维)的重塑(reshape)操作是指改变矩阵的行数和列数,同时保持矩阵中元素的总数不变。 题目描述 矩阵的重塑操作可以具体…

BEV端到端视觉论文合集|从不同的视角解析BEV感知技术

随着自动驾驶技术的不断发展,基于摄像头的感知系统已成为关键,而Bird’s Eye View (BEV)大模型在其中发挥着重要作用。BEV大模型是一种将摄像头捕捉到的2D图像转换为自上而下视角的3D感知的技术,使得车辆能够更好地理解周围环境。 BEV大模型…

centos7 ntp 时间同步

centos7 ntp 时间同步 Centos7服务器通过Chrony设置时间同步 timedatectl命令的使用 https://blog.csdn.net/yy8623977/article/details/123519718 Linux(openEuler、CentOS8)基于chrony企业内网NTP服务器搭建实验 https://blog.csdn.net/xzzteach/article/details/13840889…

高职人工智能专业实训课之“图像识别基础”

一、前言 随着人工智能技术的迅猛发展,高职院校对人工智能专业实训课程的需求日益迫切。唯众人工智能教学实训平台作为一所前沿的教育技术平台,致力于为学生提供高效、便捷的人工智能实训环境,特别在“图像识别基础”这一关键课程中&#xf…

ubuntu多版本cuda如何指定cuda版本

本文作者: slience_me ubuntu多版本cuda如何指定cuda版本 文章目录 ubuntu多版本cuda如何指定cuda版本1. 关于cuda设置1.1 查看当前安装的 CUDA 版本1.2 下载并安装所需的 CUDA 版本1.3 设置环境变量1.4 验证切换1.5 安装对应的 NVIDIA 驱动程序 2. 设置环境变量2.1…

【机器学习 复习】第5章 朴素贝叶斯分类器

一、概念 1.贝叶斯定理: (1)就是“某个特征”属于“某种东西”的概率,公式就是最下面那个公式。 2.朴素贝叶斯算法概述 (1)是为数不多的基于概率论的分类算法,即通过考虑特征概率来预测分类。 …

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具,该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接(死链)。所谓死链,即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话,…

【论文笔记】LoRA LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS

题目:LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS 来源: ICLR 2022 模型名称: LoRA 论文链接: https://arxiv.org/abs/2106.09685 项目链接: https://github.com/microsoft/LoRA 文章目录 摘要引言问题定义现有方法的问题方法将 LORA 应用于 Transformer 实…

WINUI——自定义验证特性

背景 在开发过程中验证数据是否符合要求是经常遇到的,如IP的验证、邮箱的验证、电话号码的验证等等。C#中System.ComponentModel.DataAnnotations 命名空间下提供了一些常用特性用于数据的验证,常用的如Required、MaxLength、MinLength、Key、NotMapped…

深度学习:从理论到应用的全面解析

引言 深度学习作为人工智能(AI)的核心技术之一,在过去的十年中取得了显著的进展,并在许多领域中展示了其强大的应用潜力。本文将从理论基础出发,探讨深度学习的最新进展及其在各领域的应用,旨在为读者提供全…

5G与4G的区别

“4G改变生活,5G改变社会”,已经成为了通信行业的流行语。通信的变革日新月异,从以前的1G只能接听电话,到2G可以发送短信,时光飞逝,4G将智能带进了我们的生活,每一个“G”的进步,都极…

Java宝藏实验资源库(4)对象数组

一、实验目的 学习面向对象程序设计的方法。学习建立对象数组的方法。 学习在数组中存储和处理对象。 二、实验内容、过程及结果 **10.7 (Game: ATM machine) Use the Account class created in Programming Exer cise 9.7 to simulate an ATM machine. Create ten accou…

python从入门到精通8:数字随机数

在Python中,随机数的生成和处理是编程中常见的需求之一。Python的标准库提供了random模块,该模块包含了生成各种类型随机数的函数。本教程将深入探讨Python中random模块的使用,包括生成随机数、随机选择、随机打乱顺序等高级用法。 1. 导入r…

大数据存储技术笔记

目录 大数据的特性 HDFS 读流程的基本步骤 HDFS 写流程的基本步骤 Mapreduce的执行过程 MapReduce 中 combiner 作用 hadoop 调度器及其工作方法 Hive 中内部表与外部表区别(创建删除角度) Hadoop 的 2 个主要组件及其功能 Hadoop MapReduce 的工作流程 正常工作的 ha…

解决Ubuntu修改完root密码还是不能登录

ubuntu使用Xftp、Xshell连接时,ssh服务器拒绝访问。一直显示输入密码,这是由于sshd的设置不允许root用户使用密码进行远程登录。 解决办法:修改sshd_config配置文件。如果不存在,检查是否安装了openssh openssh安装命令&#xf…

Qt C++中使用QFutureWatcher 等待多个异步任务 执行完成

在Qt开发中,处理耗时任务而不会阻塞主线程(通常负责图形用户界面的更新)是非常重要的。Qt提供了多种机制来实现这一点,其中QFutureWatcher结合QtConcurrent是处理并等待多个异步任务完成的一种强大方法。下面我们将详细解析一段代码,该代码演示了如何使用QFutureWatcher来…

AWS Lambda + Flask 应用示例

前言 AWS Lambda 本身是一个以事件驱动的 Serverless 服务, 最简单的应用就是在入口函数中对接收到的事件/请求进行处理并返回响应. 对于像 Flask 这样的 Web 框架, 并不能直接在 Lambda 上提供服务, 不过我们可以借助 AWS Lambda Web Adapter 实现一个基于 Flask 框架的 Web …