You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XLSX转JSON数组时日期解析异常,求解决方案

解决Excel日期解析为数字的问题

你遇到的这个问题是因为Excel存储日期的方式导致的——Excel里的日期本质是序列号,代表从1900年1月1日(实际是1899年12月30日,因为Excel有个历史闰年bug)开始的天数,所以20-04-1999被解析成数字36270是正常的。我们只需要把这个序列号转换成标准的日期字符串即可,这里有两种简单的解决方案:

方法1:利用xlsx库内置的日期格式化工具

xlsx库自带了SSF(Spreadsheet Format)模块,可以直接将Excel日期序列号格式化为你需要的YYYY-MM-DD格式,不需要自己手动计算日期。

修改你代码中处理student_date_of_birth的部分:

// 替换原来的student_date_of_birth赋值逻辑
if (object['Date of Birth']) {
  // 使用xlsx.SSF.format将序列号转为指定格式的日期字符串
  obj.student_date_of_birth = xlsx.SSF.format('yyyy-mm-dd', object['Date of Birth']);
} else {
  obj.student_date_of_birth = null; // 或者根据需求设置默认值
}

这个方法的好处是不需要自己处理日期计算,xlsx会帮你处理Excel的历史bug(比如1900年闰年的问题)。

方法2:手动转换日期序列号

如果你不想依赖库的内置方法,也可以手动计算日期:

if (object['Date of Birth']) {
  // Excel的日期基准是1899年12月30日(修正1900闰年bug后的正确基准)
  const excelBaseDate = new Date(1899, 11, 30);
  // 将序列号转为毫秒数,然后创建Date对象
  const dobDate = new Date(excelBaseDate.getTime() + object['Date of Birth'] * 24 * 60 * 60 * 1000);
  // 格式化为YYYY-MM-DD字符串
  obj.student_date_of_birth = dobDate.toISOString().split('T')[0];
} else {
  obj.student_date_of_birth = null;
}

完整修改后的代码片段

把你的studentList构建部分修改后,应该是这样的:

const studentList = []
data.map(object => {
  if (object['Year of Enrollment']) object['Year of Enrollment'] = parseInt(object['Year of Enrollment'])
  if (object['Semester']) object['Semester'] = parseInt(object['Semester'])
  if (object['Aadhar Number']) object['Aadhar Number'] = parseInt(object['Aadhar Number'])
  if (object['Phone Number']) object['Phone Number'] = parseInt(object['Phone Number'])
  if (object['Alternate Phone Number']) object['Alternate Phone Number'] = parseInt(object['Alternate Phone Number'])
  
  let obj = {
    "student_first_name": object['First Name'],
    "student_last_name": object['Last Name'],
    "student_branch": object['Branch'],
    "student_year": object['Year of Enrollment'],
    "student_semester": object['Semester'],
    "student_gender": object['Gender'],
    "student_email": object['Email'],
    "student_address": object['Address'],
    "student_linkedin_profile": object['Linkedin Profile'],
    "student_github_profile": object['Github Profile'],
    "student_aadhar_number": object['Aadhar Number'],
    "student_phone_number": object['Phone Number'],
    "student_date_of_birth": null, // 先设默认值
    college_id: req.body.college_id
  }
  
  // 处理出生日期转换
  if (object['Date of Birth']) {
    obj.student_date_of_birth = xlsx.SSF.format('yyyy-mm-dd', object['Date of Birth']);
  }
  
  if (object['Alternate Email']) obj.student_alternate_email = object['Alternate Email']
  if (object['Alternate Phone Number']) obj.student_alternate_phone_number = object['Alternate Phone Number']
  
  studentList.push(obj)
})

这样修改后,你的student_date_of_birth字段就会显示为"1999-04-20"这样的标准格式了。

内容的提问来源于stack exchange,提问作者Ekansh Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:32:34