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

JavaScript新手求助:从对象数组获取日期并与当前日期对比

对象数组日期比对问题:代码修正与说明

你的代码存在几个关键问题,导致日期比对逻辑无法正常工作,下面逐一指出并给出修正方案:

原代码的核心问题

  • 错误获取数组元素的日期:let objectDate = menu.date; 中,menu是数组,没有date属性,这行得到的是undefined,且循环里未更新该变量,所有判断都基于无效值
  • 字符串直接比对日期不可靠:你将当前日期拼成day-month-year格式的字符串,和数组里的DD/MM/YYYY字符串直接比较,本质是按字符顺序比对,而非实际日期的先后(比如"10-1-2024"会被认为比"09-12-2023"小,这显然不符合实际日期逻辑)
  • 日期格式不统一:当前日期的分隔符是-,数组里是/,直接全等比对永远不会触发"当天"的判断逻辑

修正后的代码

const menu = [
  {
    id: 1,
    title: "title of item one",
    date: "22/12/2023",
  },
  {
    id: 2,
    title: "title of item two",
    date: "01/02/2024",
  },
  {
    id: 3,
    title: "title of item three",
    date: "18/04/2024",
  },
];

// 工具函数:将DD/MM/YYYY格式的字符串转为Date对象
function parseDDMMYYYY(dateStr) {
  const [day, month, year] = dateStr.split('/').map(Number);
  // 注意:Date的月份是0开始的,所以要减1
  return new Date(year, month - 1, day);
}

// 工具函数:将Date对象格式化为DD/MM/YYYY的字符串(补前导零)
function formatDDMMYYYY(date) {
  const day = String(date.getDate()).padStart(2, '0');
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();
  return `${day}/${month}/${year}`;
}

// 获取当前日期(仅保留年月日,去掉时分秒)
const currentDate = new Date();
currentDate.setHours(0, 0, 0, 0);

// 遍历数组处理每个元素
menu.forEach(item => {
  const itemDate = parseDDMMYYYY(item.date);
  // 同样去掉itemDate的时分秒,确保只比对日期部分
  itemDate.setHours(0, 0, 0, 0);

  const formattedItemDate = formatDDMMYYYY(itemDate);

  if (itemDate < currentDate) {
    console.log(`【${item.title}】Sorry this deal is expired`);
  } else if (itemDate.getTime() === currentDate.getTime()) {
    console.log(`【${item.title}】Hurry! Expires TODAY`);
  } else {
    console.log(`【${item.title}】Expires on ${formattedItemDate}`);
  }
});

关键逻辑说明

  1. 日期解析与格式化:

    • parseDDMMYYYY函数把DD/MM/YYYY字符串拆分成日、月、年,转成数字后传入Date构造器(注意JS Date的月份是0-11,所以要减1)
    • formatDDMMYYYY函数用padStart(2, '0')确保日和月都是两位数字(比如1变成"01"),输出标准的DD/MM/YYYY格式
  2. 日期比对的正确性:

    • 把当前日期和每个元素的日期都设置时分秒为0,避免因为时间部分(比如当前是下午3点,而itemDate默认是凌晨0点)导致的比对错误
    • 用getTime()获取时间戳来判断日期是否相等,直接用===比对Date对象会因为引用不同而失效
  3. 遍历数组的正确姿势:

    • 使用forEach遍历数组,比for循环更简洁,直接拿到每个item,然后取item.date即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:55:55