一、实现思路
最近在开发一个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-1812:30:45formatDateString("2024.06.20",false) 会输出 2024-06-20formatDateString(44642,true) 会输出 2022-02-1400:00:00formatDateString(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} - 格式化后的日期字符串。
*/constformatDateString=(dateString, isDateTime)=>{// 帮助函数:将 Date 对象格式化为 yyyy-MM-dd HH:mm:ssconstformatDateTime=date=>{returndayjs(date).format("YYYY-MM-DD HH:mm:ss");};// 帮助函数:将 Date 对象格式化为 yyyy-MM-ddconstformatDate=date=>{returndayjs(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 =newDate(Date.UTC(1899,11,30));const dayInMs =24*60*60*1000;const parsedDate =newDate(
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 =newDate(year, month -1, day, hour, minute, second);}elseif(chineseDateMatch){const[_, year, month, day]= chineseDateMatch;
date =newDate(year, month -1, day);}elseif(dotDateMatch){const[_, year, month, day]= dotDateMatch;
date =newDate(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 =newDate(`${year}-${month}-${day}T${time ? time.trim():"00:00:00"}`);}else{
date =newDate(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);};
版权归原作者 念你那丝微笑 所有, 如有侵权,请联系我们删除。