JavaScript 将 Excel 日期序列号转为标准日期
概述
Excel 中日期的存储格式为从 1900-01-01 开始的天数序列号(如 44927 = 2023-01-01)。本文介绍如何用 JavaScript 将 Excel 日期数字转为标准日期字符串。
转换函数
function excelTimeToString(excelTime) {
// 空值处理
if (!excelTime && excelTime !== 0) {
return "";
}
// Excel 日期基准:1899-12-31 = 0, 1900-01-01 = 1
var originDate = new Date(1899, 11, 31); // 月份从0开始,11=12月
// Excel 天数转毫秒
var excelTimeInMilliseconds = excelTime * 24 * 60 * 60 * 1000;
// 计算实际日期
var convertedDate = new Date(originDate.getTime() + excelTimeInMilliseconds);
// 格式化
var year = convertedDate.getFullYear();
var month = String(convertedDate.getMonth() + 1).padStart(2, "0");
var day = String(convertedDate.getDate()).padStart(2, "0");
return year + "-" + month + "-" + day;
}使用示例
excelTimeToString(44927); // "2023-01-01"
excelTimeToString(0); // "1899-12-31"
excelTimeToString(null); // ""
excelTimeToString(1.5); // "1900-01-01"(小数表示时间)带时间的转换
function excelToDateTime(excelTime) {
if (!excelTime && excelTime !== 0) return "";
var date = new Date((excelTime - 25569) * 86400 * 1000);
// 25569 = 1970-01-01 对应的 Excel 序列号
// 86400 = 一天的秒数
return date.toISOString(); // "2023-01-01T00:00:00.000Z"
}重要说明
- Excel 日期基准:1900-01-01 = 1,1899-12-31 = 0
- 1900 年闰年 Bug:Excel 错误地将 1900 年当作闰年(实际不是),因此 1900-03-01 之后的日期需要额外减 1
- 如需处理此 Bug,判断 excelTime > 60 时减 1(第 60 天是虚构的 1900-02-29)
- 生产环境建议使用
dayjs或moment.js等成熟库处理
暂无评论
快来发表第一条评论吧!