js-xlsx 转换 json 日期变成数字问题处理

2024-03-21
-
-

js-xlsx  转换时间不对

先看正确的日期以及时分秒,文件为csv文件。

使用excel中使用加载项 excel to JSON,得到这组数据,通过下面的函数是没有问题。

excel to JSON 结果js - xlsx 转换结果

第一个时间是正确的,但是通过 js-xlsx 时间快43秒,所以在 js-xlsx 中需要精确的话,在 var seconds = total_seconds % 60; 减去43秒就能匹配上。

以下日期到时分秒方案可行,但是 js-xlsx 转换成的时间不对,导致时间存在一分钟的偏差,如果不在乎就无所谓了

//将excel的日期格式转成Date()对象;
function getFormatDate_XLSX(serial) {
    var utc_days = Math.floor(serial - 25569);
    var utc_value = utc_days * 86400;
    var date_info = new Date(utc_value * 1000);
    var fractional_day = serial - Math.floor(serial) + 0.0000001;
    var total_seconds = Math.floor(86400 * fractional_day);
    var seconds = total_seconds % 60;
    total_seconds -= seconds;
    var hours = Math.floor(total_seconds / (60 * 60));
    var minutes = Math.floor(total_seconds / 60) % 60;
    var d = new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
    /*//得到Date()对象后,便可进行日期格式化了!
    var add0 = (m) => m < 10 ? '0' + m : m;
    var d = getFormatDate_XLSX(44358.9999884259);
    var YYYY = d.getFullYear();
    var MM = add0(d.getMonth() + 1);
    var DD = add0(d.getDate());
    var hh = add0(d.getHours());
    var mm = add0(d.getMinutes());
    var ss = add0(d.getSeconds());
    return `${YYYY}-${MM}-${DD} ${hh}:${mm}:${ss}`;
    */
    return d;
}
//将excel的【支付时间】转成Date()对象
console.log(getFormatDate_XLSX(44358));//输出是【Fri Jun 11 2021 00:00:00 GMT+0800 (中国标准时间)】
console.log(getFormatDate_XLSX(44358.25));//输出是【Fri Jun 11 2021 06:00:00 GMT+0800 (中国标准时间)】
console.log(getFormatDate_XLSX(44358.685));//输出是【Fri Jun 11 2021 16:26:24 GMT+0800 (中国标准时间)】
console.log(getFormatDate_XLSX(44358.9999884259));//输出是【Fri Jun 11 2021 23:59:59 GMT+0800 (中国标准时间)】

如果只是到日期,下面的函数可以

function formatDate(numb, format) {
    const old = numb - 1;
    const t = Math.round((old - Math.floor(old)) * 24 * 60 * 60);
    const time = new Date(1900, 0, old, 0, 0, t)
    const year = time.getFullYear();
    const month = time.getMonth() + 1;
    const date = time.getDate();
    return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
  }
console.log(formatDate(45125.8728819444,'/'))
console.log(formatDate(45125.87337962963,'/'))

返回的结果正确

网上面其他函数是有问题的,比如下面这个

function formatDate(numb, format) {
    var hourTmp = numb * 24;
    var hour = Math.floor(hourTmp);
    var minuteTmp = hourTmp - hour;
    var minute = Math.round(minuteTmp * 60);
    return (hour < 10 ? '0' + hour : hour) + format + (minute < 10 ? '0' + minute : minute);
  }
console.log(formatDate(45125.8728819444,'/'))
console.log(formatDate(45125.87337962963,'/'))

第二个错误的方案

虽然说他这个日期减去了一天,但是有些是多一天,但是对于有些还是还是不准确,比如

 function formatDate(numb, format) {
    let time = new Date((numb - 1) * 24 * 3600000 + 1)
    time.setYear(time.getFullYear() - 70)
    let year = time.getFullYear() + ''
    let month = time.getMonth() + 1 + ''
    let date = time.getDate() + ''
    if(format && format.length === 1) {
    return year + format + month + format + date
    }
    return year+(month < 10 ? '0' + month : month)+(date < 10 ? '0' + date : date)
  }
console.log(formatDate(45125.8728819444,'/'))
console.log(formatDate(45125.87337962963,'/'))

第三个错误的方案,结果还是不对的,但是可以微调

function formatDate(numb, format) {
      let  time = new Date( (numb - 25567) * 24 * 3600000  - 
        5 * 60 * 1000 -
        43 * 1000 - 
        24 * 3600000 - 8 * 3600000 );

    let year = time.getFullYear() + ''
    let month = time.getMonth() + 1 + ''
    let date = time.getDate() + ''
    if (format && format.length === 1) {
       return year + format + month + format + date
    }
    return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
  }
console.log(formatDate(45125.8728819444,'/'))
console.log(formatDate(45125.87337962963,'/'))

但是在调整一下,看到结果比实际多了一天,那是不是就-1就可以了

调整一下代码,输出的结果就是正确的

function formatDate(numb, format) {
      let  time = new Date( (numb - 25567 - 1) * 24 * 3600000  - 
        5 * 60 * 1000 -
        43 * 1000 - 
        24 * 3600000 - 8 * 3600000 );

    let year = time.getFullYear() + ''
    let month = time.getMonth() + 1 + ''
    let date = time.getDate() + ''
    if (format && format.length === 1) {
       return year + format + month + format + date
    }
    return year + (month < 10 ? '0' + month : month) + (date < 10 ? '0' + date : date)
  }
console.log(formatDate(45125.8728819444,'/'))
console.log(formatDate(45125.87337962963,'/'))

 

js-xlsx 自带的格式化好像不起作用

加上没有任何作用,还是原来的数字没有变化,不清楚原因。

“您的支持是我持续分享的动力”

微信收款码
微信
支付宝收款码
支付宝

黄金_shmaur
不积跬步,无以至千里;不积小流,无以成江海
目录关闭