js完美地处理转换 Excel 的日期格式
生活随笔
收集整理的這篇文章主要介紹了
js完美地处理转换 Excel 的日期格式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題提出
在使用 js 做 Excel 文件讀取時,我們發現對于日期的處理很棘手。主要存在以下幾種情況:
- 所有的日期單元格讀取到的是一個類似 44211.7533 的數字的問題
- 格式不規范問題,如 2021-1-1 0:0:00
- 按指定格式格式化的問題
帶著這幾個問題,我在網上找了幾篇文章,但是都不能很好地解決,所以自己動手解決,并整理分享出來,希望對大家有所幫助
解決方案
/*** 處理從 Excel 單元格中讀取到的日期格式的字段并轉換為指定格式的日期字符串* * @param {string|number} date 從 Excel 單元格中讀取到的日期格式* @param {string} fmt 要轉換為的格式,默認 yyy-MM-dd HH:mm:ss*/ function handleDate(date, fmt) {if (!date) {return date;}date = date.trim ? date.trim() : date;if (/^[\d.]+$/.test(date)) {let dateNum = parseFloat(date);// 大于 1000 萬說明是一個毫秒數,直接解析并轉換為指定格式即可if (dateNum > 10000000) {return formatDate(dateNum, fmt);}// 否則認為這個是一個 Excel 格式的日期date = formatExcelDate(dateNum, fmt);console.log(date, typeof (date), dateNum)} else {// 處理中文冒號,和 yyyy/MM/dd 格式的問題date = date.replace(/:/g, ":").replace(/\//g, "-");}// 將不規則的格式,例如 "2020-1-1 1:3:3" 轉換成 yyyy-MM-dd HH:mm:ss// 再轉為 Date 對象進行指定的格式化console.log(date);let dtPars = date.split(/\s+/g)let dPars = dtPars[0].split("-");dPars[1] = padding2(dPars[1])dPars[2] = padding2(dPars[2])dtPars[0] = dPars.join("-");if (!dtPars[1]) {dtPars[1] = '00:00:00';} else {let tPars = dtPars[1].split(':');tPars[0] = padding2(tPars[0]);// 支持分缺失tPars[1] = padding2(tPars[1] || '00');// 支持秒缺失tPars[2] = padding2(tPars[2] || '00');dtPars[1] = tPars.join(':');}return formatDate(new Date(dtPars.join(" ")), fmt); }/*** 缺位補0*/ function padding2(part) {if (part.length === 1) {return "0" + part} else {return part;} }/*** 解析Excel表達的日期數字,并轉換為指定格式的日期字符串* * @param {number} numb Excel解析出的數字形式的日期* @param {string} format 要轉換為的格式,默認 yyy-MM-dd HH:mm:ss*/ function formatExcelDate(numb, format) {const time = new Date((numb - 2) * 24 * 3600000 + 1);time.setYear(time.getFullYear() - 70);time.setHours(time.getHours() - 8);return formatDate(time, format); }/*** 日期格式轉換* * @param {date|number} date 日期* @param {string} fmt 要轉換為的格式,默認 yyy-MM-dd HH:mm:ss*/ function formatDate(date, fmt) {date = date == undefined ? new Date() : date;date = typeof date == 'number' ? new Date(date) : date;fmt = fmt || 'yyyy-MM-dd HH:mm:ss';let obj ={'y': date.getFullYear(), // 年份,注意必須用getFullYear'M': date.getMonth() + 1, // 月份,注意是從0-11'd': date.getDate(), // 日期'q': Math.floor((date.getMonth() + 3) / 3), // 季度'w': date.getDay(), // 星期,注意是0-6'H': date.getHours(), // 24小時制'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小時制'm': date.getMinutes(), // 分鐘's': date.getSeconds(), // 秒'S': date.getMilliseconds() // 毫秒};let week = ['天', '一', '二', '三', '四', '五', '六'];for (let i in obj) {fmt = fmt.replace(new RegExp(i + '+', 'g'), function (m) {let val = obj[i] + '';if (i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];for (let j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;return m.length == 1 ? val : val.substring(val.length - m.length);});}return fmt; }使用示例
假設我們有這樣一張 Excel 表:
| 1 | 張三 | 2021/1/1 8:00:00 | 2021/1/1 18:00:00 |
| 2 | 李四 | 2021/1/1 9:30:00 | 2021/1/1 19:15:00 |
我們使用 node-xlsx 讀取:
const nodeXlsx = require('node-xlsx') //引用node-xlsx模塊 var fs = require('fs'); // 讀取excel表格 const ex1 = nodeXlsx.parse(filePath)//取出excel文件中的第一個工作表中的全部數據 let excel_content = ex1[0].data// 刪掉表頭 excel_content.splice(0, 1); let records = excel_content.map(row => {return {id: row[0],name: row[1],startTime: handleDate(row[2], 'yyyy-MM-dd HH:mm:ss'),endTime: handleDate(row[3], 'yyyy-MM-dd HH:mm:ss')} }); console.log(JSON.stringify(records))這時我們將得到正確的日期格式結果:
[{"id": 1, "name": "張三", "startTime": "2021-01-01 08:00:00", "endTime": "2021-01-01 18:00:00"}, {"id": 2, "name": "李四", "startTime": "2021-01-01 09:30:00", "endTime": "2021-01-01 19:15:00"}]總結
以上是生活随笔為你收集整理的js完美地处理转换 Excel 的日期格式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英伟达创办人黄仁勋台大毕典演说全文
- 下一篇: 内容溢出:overflow