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

JavaScript按日期时间从新到旧排序失效,求问题定位与解决

问题:自定义日期格式的对象数组无法正确按时间排序

原始对象数组:

const dateAndTime = [
  {
    "createdAt": "20/02/2024, 16:13:51"
  },
  {
    "createdAt": "20/02/2024, 16:15:23"
  },
  {
    "createdAt": "18/02/2024, 14:27:31"
  },
  {
    "createdAt": "18/02/2024, 15:41:06"
  },
  {
    "createdAt": "21/03/2024, 22:09:35"
  },
  {
    "createdAt": "07/03/2024, 17:24:19"
  },
];

尝试的排序代码:

dateAndTime.sort((a, b) => {
  const dateA = new Date(a.createdAt);
  const dateB = new Date(b.createdAt);
  return dateB.getTime() - dateA.getTime();
});

console.log(dateAndTime);

实际排序未生效,预期最新的21/03/2024, 22:09:35应排在首位。


错误原因

new Date()无法可靠解析DD/MM/YYYY, HH:mm:ss这种格式。JavaScript的Date构造函数对非ISO 8601格式的日期解析依赖运行环境,大部分情况下会把DD/MM/YYYY误认为MM/DD/YYYY,当日期部分的日数超过12时(比如20/02或21/03),会解析出无效或错误的Date对象,导致getTime()返回的时间戳异常,排序逻辑失效。


解决方案

手动解析自定义格式的日期字符串,明确指定年、月、日等时间参数来构造准确的Date对象:

dateAndTime.sort((a, b) => {
  // 自定义解析函数:处理DD/MM/YYYY, HH:mm:ss格式
  const parseCustomDate = (dateStr) => {
    // 拆分日期和时间部分
    const [dateSegment, timeSegment] = dateStr.split(', ');
    // 拆分日、月、年(注意月份在Date中是0索引,需要减1)
    const [day, month, year] = dateSegment.split('/').map(Number);
    // 拆分时、分、秒
    const [hours, minutes, seconds] = timeSegment.split(':').map(Number);
    // 构造准确的Date对象
    return new Date(year, month - 1, day, hours, minutes, seconds);
  };

  const dateA = parseCustomDate(a.createdAt);
  const dateB = parseCustomDate(b.createdAt);
  // 按时间戳倒序排序(新→旧)
  return dateB.getTime() - dateA.getTime();
});

console.log(dateAndTime);

这段代码通过手动拆分日期字符串的各个部分,避免了环境依赖的解析错误,构造出的Date对象时间戳准确,排序逻辑可以正常工作,最终会得到预期的从新到旧的排列结果。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:34:59