使用date-fns为出生日期数组加年数输出错误该如何解决
问题根因
- 你遍历的是提前提取的
childbirthYear纯年份数组,调用addYears时传入的是new Date(年份数字),而new Date(数字)会把入参当做1970年1月1日以来的毫秒数处理,并不是你以为的对应年份的日期,所以才会生成1988年的错误结果。 - 仅对比年份差判断是否满18岁逻辑不严谨,比如孩子生日在12月,周期结束在同年1月,年份差刚好18但实际还没满18岁,会导致计算偏差。
修正方案
直接遍历原始的childBirthDate完整日期字符串数组计算,配合date-fns的differenceInYears方法计算实际年龄,逻辑更严谨,也能解决日期生成错误的问题。
修正后代码如下:
import { addYears, differenceInYears } from 'date-fns'; this.childBirthDate = [ '2012-02-16T20:00:00.000Z', '2010-05-19T20:00:00.000Z', '2016-05-19T20:00:00.000Z', ]; // 计算周期结束日期(保留原有逻辑) const endYear = date.getFullYear() + 10; date.setFullYear(endYear); this.endDate = date.toISOString(); const periodEndDate = new Date(this.endDate); this.final = []; // 直接遍历原始出生日期数组计算 this.childBirthDate.forEach(birthDateStr => { const birthDate = new Date(birthDateStr); const ageAtPeriodEnd = differenceInYears(periodEndDate, birthDate); if (ageAtPeriodEnd < 18) { this.final.push(this.endDate); } else { this.final.push(addYears(birthDate, 18).toISOString()); } }); console.log(this.final); // 输出与你预期的结果一致 this.personalInfo = { personalInfoId: 0, underageChildInfo: this.data.underageChildInfo?.map((i, index) => ({ firstName: i.name, endDate: this.final[index], })), };
内容的提问来源于stack exchange,提问作者user16405978
相关产品推荐
相关产品推荐

