近期有个需求,在Excel里面的是时间格式,方便用户输入转换,现在要获取Excel里面的格式,转换成时间,但是Excel的时间格式跟js不一样,记录一下过程
-
Excel内容为:
-
这种格式获取之后位数为五位数一般是这种形式展示,例如:44988.00717592592,获取方式就不写了,很多插件都有
-
一开始用的直接转换,也可以做到,但是有的时间会有一秒钟的误差,就很莫名其妙
new Date((time-25568) * 24 * 3600000 - 24 * 3600000 - 8 * 3600000).getTime()
// 这个公式偶尔会有一秒的误差,所以pass了,换下面的这种
-
然后又手写一个转换公式,直接传入获取到的Excel时间就行了,返回的是GMT时间(强烈推荐)
function ExcelDateToJSDate(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;
return new Date(date_info.getFullYear(), date_info.getMonth(), date_info.getDate(), hours, minutes, seconds);
}
执行一下
ExcelDateToJSDate(44988.916666666664)
// 获取到的是 Fri Mar 03 2023 22:00:00 GMT+0800 (中国标准时间)
// 如果需要转换成时间戳
ExcelDateToJSDate(44988.916666666664).getTime()
// 得到:1677852000000
记录一下,避免踩坑~