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

如何基于当前日期对含MM-DD格式日期的JS对象数组进行排序

原代码存在的问题

  1. 直接传入MM-DD格式字符串给Date构造函数,不同浏览器的解析逻辑存在差异,且默认会自动补全当前年份,容易出现日期解析错误。
  2. 排序逻辑仅按时间戳大小排序,没有按需求区分「未来日期」和「已过日期」两个分组,排序规则不匹配。

解决方案

首先明确排序规则:

  • 未到的未来日期整体排在已过日期前面
  • 未来日期按距离当前日期的时间差升序排列(越近越靠前)
  • 已过日期按距离当前日期的时间差升序排列(越远越靠前)

完整实现代码

var array = [{id: 1, date:'12-28'}, 
{id: 2, date:'11-30'}, 
{id: 3, date:'09-30'}, 
{id: 4, date:'05-30'}];

// 计算MM-DD格式日期和当前日期的毫秒差
function getDateDiff(monthDay) {
  const now = new Date();
  // 把时分秒清零,仅比较日期,避免时间影响
  now.setHours(0, 0, 0, 0);
  const currentYear = now.getFullYear();
  // 拼接为标准YYYY-MM-DD格式,避免解析错误
  const targetDate = new Date(`${currentYear}-${monthDay}`);
  targetDate.setHours(0, 0, 0, 0);
  return targetDate.getTime() - now.getTime();
}

array.sort(function(a, b) {
  const diffA = getDateDiff(a.date);
  const diffB = getDateDiff(b.date);
  // 两个都是未来日期,按差值升序,越近越靠前
  if (diffA >= 0 && diffB >= 0) {
    return diffA - diffB;
  }
  // 两个都是已过日期,按差值升序,越远越靠前
  if (diffA < 0 && diffB < 0) {
    return diffA - diffB;
  }
  // 一个未来一个已过,未来的排在前面
  return diffA >= 0 ? -1 : 1;
});

console.log(array);

如果需要处理跨年场景(比如当前日期为12月30日,01-05是下一年的最近日期),可以修改getDateDiff函数,自动判断是否需要使用下一年的日期计算差值:

function getDateDiff(monthDay) {
  const now = new Date();
  now.setHours(0, 0, 0, 0);
  const currentYear = now.getFullYear();
  let targetDate = new Date(`${currentYear}-${monthDay}`);
  targetDate.setHours(0, 0, 0, 0);
  let diff = targetDate.getTime() - now.getTime();
  // 如果今年的日期已过,计算下一年同日期的差值
  if (diff < 0) {
    const nextYearDate = new Date(`${currentYear + 1}-${monthDay}`);
    nextYearDate.setHours(0, 0, 0, 0);
    diff = nextYearDate.getTime() - now.getTime();
  }
  return diff;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 22:45:04