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
相关产品推荐
相关产品推荐

