After Effects表达式问题:基于MM/DD/YYYY格式生日计算年龄
在After Effects中根据生日字符串计算年龄的问题与解决方法
我需要在After Effects中实现以下需求:在一个文本层输入MM/DD/YYYY格式的生日(如12/22/1989),通过表达式让另一个文本层自动输出对应的年龄。我尝试了两段表达式都出现了问题:
第一段表达式的问题
第一段代码:
var birthDateString = thisComp.layer("Birth Date").text.sourceText; function dateToCurrentFormat(dateString) { var parts = dateString.split(/[/]/); var month = Number(parts[0]) - 1; // months are 0-based var day = Number(parts[1]); var year = Number(parts[2]); return new Date(year, month, day); } function difference(date1, date2, interval) { var second = 1000, minute = second * 60, hour = minute * 60, day = hour * 24, week = day * 7; date1 = new Date(date1); date2 = new Date(date2); var timediff = date2 - date1; if (isNaN(timediff)) return NaN; switch (interval) { case "years": return date2.getFullYear() - date1.getFullYear(); case "months": return ( (date2.getFullYear() * 12 + date2.getMonth()) - (date1.getFullYear() * 12 + date1.getMonth()) ); case "weeks": return Math.floor(timediff / week); case "days": return Math.floor(timediff / day); case "hours": return Math.floor(timediff / hour); case "minutes": return Math.floor(timediff / minute); case "seconds": return Math.floor(timediff / second); default: return undefined; } } var birthDate = dateToCurrentFormat(birthDateString); var age = difference(birthDate, new Date(), "years"); var ageString = age + " years old"; ageString;
出现dateToCurrentFormat is not defined、difference is not defined及类型匹配错误。
问题原因:
- AE表达式引擎对函数声明的作用域处理特殊,直接嵌套函数容易出现识别问题;
thisComp.layer("Birth Date").text.sourceText返回的是TextDocument对象,不是纯字符串,直接传给函数会导致类型不匹配,必须提取纯文本内容。
第二段表达式的问题
第二段代码:
var dob = thisComp.layer("Birth Date").text.sourceText; var year = Number(dob.substr(0, 4)); var month = Number(dob.substr(4, 2)) - 1; var day = Number(dob.substr(6, 2)); var today = new Date(); var age = today.getFullYear() - year; if (today.getMonth() < month || (today.getMonth() == month && today.getDate() < day)) { age--; } age;
返回NaN结果。
问题原因:
- 未将TextDocument对象转为纯字符串,
dob是对象而非字符串,调用substr方法会出错,导致year/month/day全部为NaN; - 字符串截取逻辑错误:
MM/DD/YYYY格式的生日,substr(0,4)会取到前4个字符(比如12/2),完全不符合提取年份的预期,应该先按/分割再提取对应部分。
正确的简便实现
在输出年龄的文本层的Source Text属性上添加以下表达式:
// 获取生日文本层的纯字符串内容 birthStr = thisComp.layer("Birth Date").text.sourceText.value.toString(); // 按/分割日期部分 dateParts = birthStr.split("/"); if (dateParts.length !== 3) { "请输入MM/DD/YYYY格式的生日"; } else { // 转换为数字,注意月份是0-based birthMonth = parseInt(dateParts[0]) - 1; birthDay = parseInt(dateParts[1]); birthYear = parseInt(dateParts[2]); today = new Date(); // 初始年龄计算 age = today.getFullYear() - birthYear; // 校验是否还没到当年生日,没到则减1 if (today.getMonth() < birthMonth || (today.getMonth() === birthMonth && today.getDate() < birthDay)) { age--; } age + " years old"; }
关键注意点:
- 必须用
value.toString()将TextDocument对象转为纯字符串,避免类型错误; - 按
/分割后提取月、日、年,完全匹配MM/DD/YYYY的格式逻辑; - 添加格式校验,当输入的生日格式不符合要求时,会显示错误提示。
内容的提问来源于stack exchange,提问作者eager.beaver
相关产品推荐
相关产品推荐

