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

如何在Ajv中集成自定义函数验证UTC毫秒出生日期的18-100岁要求

在Ajv中集成自定义年龄校验逻辑(基于UTC毫秒时间戳)

要实现基于年龄范围的动态校验,你需要给Ajv注册自定义关键字,把你的utc_to_age函数嵌入到校验逻辑里,具体步骤如下:

1. 注册自定义校验关键字

给Ajv实例添加一个自定义关键字(比如命名为ageRange),指定它的作用类型和校验逻辑:

  • 关键字仅作用于integer类型的时间戳字段
  • 在校验逻辑中调用utc_to_age将时间戳转换为年龄
  • 判断转换后的年龄是否在18到100岁的范围内

2. 完整代码示例

// 导入Ajv(Node.js环境用require,浏览器环境按需引入)
const Ajv = require('ajv');
const ajv = new Ajv();

// 你的UTC时间戳转年龄函数(已实现核心逻辑)
function utc_to_age(utc) {
  const birthDate = new Date(utc);
  const now = new Date();
  let age = now.getFullYear() - birthDate.getFullYear();
  // 修正未到生日的情况
  const monthDiff = now.getMonth() - birthDate.getMonth();
  if (monthDiff < 0 || (monthDiff === 0 && now.getDate() < birthDate.getDate())) {
    age--;
  }
  return age;
}

// 注册自定义校验关键字
ajv.addKeyword({
  keyword: 'ageRange',
  type: 'integer',
  validate: (_, data) => {
    const age = utc_to_age(data);
    return age >= 18 && age <= 100;
  },
  // 可选:添加错误提示
  errors: true,
  messages: {
    en: '出生日期对应的年龄必须在18到100岁之间'
  }
});

// 编写校验Schema
const schema = {
  type: 'object',
  properties: {
    dob_millisecond: {
      type: 'integer',
      ageRange: true // 启用自定义年龄校验
    }
  },
  required: ['dob_millisecond']
};

// 编译Schema并验证数据
const validate = ajv.compile(schema);

// 测试用例
const validData = { dob_millisecond: new Date('2000-01-01').getTime() }; // 符合年龄要求
const invalidUnderAge = { dob_millisecond: new Date('2010-01-01').getTime() }; // 未满18岁
const invalidOverAge = { dob_millisecond: new Date('1920-01-01').getTime() }; // 超过100岁

console.log(validate(validData)); // true
console.log(validate(invalidUnderAge)); // false,可通过validate.errors查看错误详情
console.log(validate(invalidOverAge)); // false

灵活扩展说明

如果需要支持可配置的年龄范围(比如不同场景用不同上下限),可以把ageRange的schema值改为对象格式:

// 修改关键字配置
ajv.addKeyword({
  keyword: 'ageRange',
  type: 'integer',
  validate: (schema, data) => {
    const age = utc_to_age(data);
    return age >= schema.min && age <= schema.max;
  }
});

// Schema中配置具体范围
const schema = {
  properties: {
    dob_millisecond: {
      type: 'integer',
      ageRange: { min: 18, max: 100 }
    }
  }
};

内容的提问来源于stack exchange,提问作者Bear Bile Farming is Torture

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 10:45:34