转换成的一串数字代表的是距离1900-1-1的天数
网上最普遍的方法:
function formatDate(numb, format) {
const time = new Date((numb - 1) * 24 * 3600000 + 1);
time.setYear(time.getFullYear() - 70)
const year = time.getFullYear() ;
const month = time.getMonth() + 1 ;
const date = time.getDate() - 1 ;
return year + format + (month < 10 ? '0' + month : month) + format + (date < 10 ? '0' + date : date)
}
但是亲测这个方法有误差,算出来的时间有可能会平年少一天( time.getDate() - 1 ),比如我excel里面输入的是2022/03/08,转换数字为44628.转换出来确是2022/03/07,time.getDate()会闰年多一天,2024/6/1会变成2024/6/2。
正确的算法应该是:
方法1:
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);
}
方法2:
//timeValue是指excel中的时间整数值
function formatDate(timeValue) {
let time = new Date((timeValue - 1) * 24 * 3600000 + 1);
time.setYear(time.getFullYear() - 70);
let year = time.getFullYear() + "";
let month = time.getMonth() + 1 + "";
let date = time.getDate() + "";
if (leapyear(year)) {
//如果是闰年
date = time.getDate() - 1 + "";
}
return year + "-" + (month < 10 ? "0" + month : month) + "-" + (date < 10 ? "0" + date : date);
}
//区分闰年与平年
function leapyear(year) {
var flag = false;
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) {
flag = true;
}
return flag;
}