XLSX.js解析Excel遇到的問題

使用xlsx.js讀取Excel中的日期有兩種方式:segmentfault

  1. XLSX.read(file, { type: 'binary' })
  2. XLSX.read(file, { type: 'binary', cellDates: true })

經過第一種方式讀取日期,解析結果是Excel中保存的數字(Excel會將日期保存爲數字。例如,將2020/09/30由日期格式改爲文本格式時,會獲得一個44104這樣的數字,它表明的是從1900/01/01開始,到該日期的天數。)excel

拿到這個數字後,經過moment.js對其進行格式轉化:code

moment('1900/01/01').add(moment.duration({ 'days': 44104 - 1 })).format('YYYY/MM?DD')
// => 2020/10/01

然而獲得的日期會比實際日期2020/09/30多一天,具體緣由是由於在Excel中, 1900年被錯誤地當成了閏年,1900/02/28後面的日期對應的數字比實際多了1900/02/29這一天。須要在進行特殊處理:orm

const START_TIME = '1900/01/01'
const FORMAT = 'YYYY/MM/DD'
export const formatExcelDate = (num) => {
 let duration = num - 1
 // 1900/2/29的num爲60
 if (num > 60) {
 // 對於num大於60的需解析日期,要減去多的1900/2/29日的那一天
 duration = num - 2
 }
 return moment(START_TIME).add(moment.duration({ 'days': duration })).format(FORMAT)
}
​
formatExcelDate(44104) // => 2020/09/30

經過第二種方式讀取日期,解析結果是一個日期對象。對象

通常狀況下,對於1901/01/01之前的日期如1900/02/05,會解析爲Sun Feb 04 1900 00:05:00 GMT+0805 (中國標準時間),對於1901/01/01及之後的日期如2020/05/20,會解析爲Tue May 19 2020 23:59:17 GMT+0800 (中國標準時間)爲什麼會有GMT+0805 (中國標準時間)?get

能夠看到1901/01/01後的解析日期比實際晚了43秒,具體緣由未知。還有另一個問題就是,同一日期在不一樣電腦上解析的結果不一致,緣由暫時未知。io

相關文章
相關標籤/搜索