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

如何从日期数组中获取指定日期的最近过去日期?

如何从日期数组中找到指定日期之前的最近过去日期?

你现在有这样的日期数组和目标日期:

const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';

想要找到dateToCheckFor之前的最近日期(这里期望得到2020-07-06),但之前写的forEach代码返回了最早的2020-07-03,这是因为你的逻辑判断搞反了。

问题出在哪里?

你的代码里,当找到一个在目标日期之前的日期时,判断moment(date).diff(moment(nearestDate), 'days') < 0——这个条件的意思是当前date比已经记录的nearestDate更早,所以每次都会把更早的日期赋值给nearestDate,最后自然得到数组里最早的日期,完全和你想要的“最近”相反。

解决方案1:简化逻辑,先筛选再取最大值

最简单的方式是先把所有早于目标日期的日期筛选出来,然后从中找出最大的那个(也就是最近的)。因为ISO格式的日期字符串(YYYY-MM-DD)可以直接比较大小,甚至不用moment也能实现:

const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';

// 筛选出所有早于目标日期的日期
const pastDates = datesToBeChecked.filter(date => date < dateToCheckFor);
// 取其中最大的(最近的)
const nearestDate = pastDates.length ? Math.max(...pastDates) : null;

console.log(nearestDate); // 输出 "2020-07-06"

如果一定要用moment的话,逻辑类似:

const pastDates = datesToBeChecked.filter(date => moment(date).isBefore(dateToCheckFor));
const nearestDate = pastDates.length ? moment.max(pastDates.map(date => moment(date))).format('YYYY-MM-DD') : null;

解决方案2:修正你的forEach逻辑

如果要保留forEach的写法,需要调整判断条件:当找到符合条件的日期时,要比较它是否比当前记录的nearestDate更晚(也就是离目标日期更近),可以直接比较日期字符串大小:

const datesToBeChecked = ['2020-07-03','2020-07-06', '2020-07-13', '2020-07-20']
const dateToCheckFor = '2020-07-12';
let nearestDate = null;

datesToBeChecked.forEach(date => {
  const isPastDate = moment(date).isBefore(dateToCheckFor);
  if (isPastDate) {
    if (!nearestDate || date > nearestDate) {
      // 如果还没记录过nearestDate,或者当前date比已记录的更晚(更近),就替换
      nearestDate = date;
    }
  }
});

console.log(nearestDate); // 输出 "2020-07-06"

这样调整后,逻辑就正确了,每次都会保留离目标日期最近的那个过去日期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 16:37:35