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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 22:11:03