js-xlsx
转换时间不对
先看正确的日期以及时分秒,文件为csv文件。
使用excel中使用加载项 excel to JSON
,得到这组数据,通过下面的函数是没有问题。
excel to JSON 结果 | js - xlsx 转换结果 |
第一个时间是正确的,但是通过 |
以下日期到时分秒方案可行,但是 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
自带的格式化好像不起作用
加上没有任何作用,还是原来的数字没有变化,不清楚原因。