JavaScript实现Google Sheets DATEVALUE函数遇错误,求正确方案
实现Google Sheets DATEVALUE函数的JavaScript等效方案
你的代码有两个关键问题导致结果和Google Sheets不一致:
1. 基准日期的月份索引错误
JavaScript的Date对象采用0-based月份索引(0=1月,11=12月),你写的new Date(1899, 12, 30)实际创建的是1900年1月30日,而非预期的1899年12月30日,直接导致基准日期偏差了31天。
2. Google Sheets的1900年闰年历史bug
Google Sheets继承了旧版Excel的错误:错误地将1900年判定为闰年(实际1900年不是闰年,没有2月29日)。因此,从1900年3月1日开始,DATEVALUE的序列号会比真实天数多1(因为多算了不存在的1900年2月29日),而JavaScript的Date对象是按照真实历法计算的,需要手动补上这个差值。
修正后的代码
function getGoogleSheetsDateValue(inputDate) { // 正确的基准日期:1899年12月30日(JS中11代表12月) const baseDate = new Date(1899, 11, 30); const targetDate = new Date(inputDate); // 计算目标日期与基准日期的毫秒差,转换为天数 const msPerDay = 24 * 60 * 60 * 1000; let daysSinceBase = Math.floor((targetDate - baseDate) / msPerDay); // 处理1900年闰年bug:1900年3月1日及之后的日期需加1 const bugThreshold = new Date(1900, 2, 1); // 1900年3月1日(2代表3月) if (targetDate >= bugThreshold) { daysSinceBase += 1; } return daysSinceBase; } // 测试你的示例:输入12/07/2026 console.log(getGoogleSheetsDateValue("12/07/2026"));
验证结果
运行上述代码后,输出的序列号在Google Sheets中反向转换会得到正确的12/07/2026,和你预期的一致。
内容的提问来源于stack exchange,提问作者Harish IDC
相关产品推荐
相关产品推荐

