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

如何在日期数组中查找切换方向对应的最近日期?

日期切换逻辑实现方案

现有日期数组:

['2023-06-02T00:00:00.000+03:00','2023-06-02T00:00:00.000+03:00','2023-12-04T00:00:00.000+03:00']

需求:日期组件切换时,根据向左(切换到更小日期)或向右(切换到更大日期)的方向,从上述数组中找出对应方向的最近日期。

你写的雏形代码缺少有效的筛选和极值判断逻辑,下面是完善后的实现方案:

const dateSwitch = (prev: boolean) => {
  // 把当前选中日期转成标准化的DateTime对象,统一格式避免时区/时分秒干扰
  const currentDate = DateTime.fromISO(date.value).startOf("day");
  let newDate: DateTime = DateTime.fromJSDate(new Date()).startOf("day");

  if (enabledDates.value.length) {
    // 数组去重并转成标准化DateTime对象,减少重复计算
    const normalizedDates = [...new Set(enabledDates.value)].map(dateStr => 
      DateTime.fromISO(dateStr).startOf("day")
    );

    if (prev) {
      // 向左切换:筛选所有小于当前日期的选项,取其中最大的(最近的更小日期)
      const validDates = normalizedDates.filter(d => d < currentDate);
      if (validDates.length) {
        newDate = validDates.reduce((prevDate, currDate) => 
          currDate > prevDate ? currDate : prevDate
        );
      }
    } else {
      // 向右切换:筛选所有大于当前日期的选项,取其中最小的(最近的更大日期)
      const validDates = normalizedDates.filter(d => d > currentDate);
      if (validDates.length) {
        newDate = validDates.reduce((prevDate, currDate) => 
          currDate < prevDate ? currDate : prevDate
        );
      }
    }
  }

  // 将结果转为需要的格式并更新选中日期
  date.value = newDate.toISO();
};

关键逻辑说明

  • 统一日期格式:把所有日期都转成startOf("day")的DateTime对象,确保比较时不会被时分秒、时区差异影响
  • 数组去重:用Set剔除重复日期,避免重复数据干扰判断
  • 方向匹配筛选:
    • 向左切换时,找比当前日期小的所有日期里的最大值,就是离当前最近的更小日期
    • 向右切换时,找比当前日期大的所有日期里的最小值,就是离当前最近的更大日期
  • 边界处理:如果没有符合条件的日期(比如当前已是数组最小/最大日期),会保持默认的当日日期,你也可以根据需求改成禁用切换或其他逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 01:35:08