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

使用Moment/Day.js库比较JS数组日期,校验5年范围

日期间隔校验实现方案

需求说明

比较数组中的两个日期值,若日期间隔超过5年则显示错误提示,要求实现无硬编码的逻辑。

给定数组示例

const filterAry = [
  {type: 'date', name: 'fromDate',  value:['15/02/2017']},
  {type: 'date', name: 'toDate',  value:['15/02/2023']},
  {type: 'string', name: 'code',  value:'new role'}
];

当前问题

使用Moment.js筛选日期项并计算差值的代码无法正常运行,且存在硬编码判断字段名的问题,需要优化实现逻辑。

解决方案代码

// 1. 筛选所有类型为date的项
const dateItems = filterAry.filter(item => item.type === 'date');

// 2. 将日期项转换为键值对映射(name为键,moment日期对象为值)
const dateMap = dateItems.reduce((map, item) => {
  // 解析日期并校验有效性
  const date = moment(item.value[0], 'DD/MM/YYYY');
  if (!date.isValid()) {
    console.error(`错误:无效日期格式 - ${item.value[0]}`);
    return map;
  }
  map[item.name] = date;
  return map;
}, {});

// 3. 校验两个日期是否存在并计算间隔
if (dateMap.fromDate && dateMap.toDate) {
  // 计算精确年数差值(第三个参数true返回小数,避免整年截断)
  const yearDifference = dateMap.toDate.diff(dateMap.fromDate, 'years', true);
  
  if (yearDifference > 5) {
    console.error('错误:日期间隔超过5年');
    // 此处可替换为项目实际的错误提示逻辑(如弹窗、表单提示等)
  }
}

代码说明

  • 无硬编码实现:通过reduce将日期项转换为键值对映射,无需硬编码判断fromDate/toDate字段名,后续扩展其他日期字段时无需修改逻辑
  • 日期有效性校验:添加isValid()判断,避免无效日期格式导致的计算错误
  • 精确差值计算:使用diff方法的第三个参数true获取包含小数的年数差值,避免出现「差5年1天却被判定为5年」的误差
  • 逻辑解耦:将筛选、映射、校验、计算拆分,代码更易维护和扩展

内容的提问来源于stack exchange,提问作者user1881845

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:16:03