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

JavaScript中按'MMMM Do YYYY, h:mm:ss am/pm'格式排序日期出错求助

解决JavaScript日期字符串排序错误的问题

你的排序逻辑出错的核心原因是直接比较日期字符串——像'Mar 12 2017 10:00:00 am'这种格式的字符串,没办法通过字符顺序的比较来正确对应时间的先后。比如字符串'10:00:00 am'和'08:00:00 pm',前者的第一个数字是1,后者是0,字符串比较时会认为'10:...'更大,但实际上晚上8点显然比上午10点晚,这就导致了排序结果不符合预期。

修正方法:将字符串转为Date对象后比较

正确的做法是把每个元素的date字符串转换成Date对象,然后通过比较时间戳(或者直接比较Date对象)来实现排序。这样就能保证时间顺序的准确性。

修正后的代码:

var array = [
  { id: 1, date: 'Mar 12 2017 10:00:00 am' },
  { id: 2, date: 'Mar 12 2017 08:00:00 pm' },
  { id: 3, date: 'Mar 12 2017 05:00:00 am' },
  { id: 4, date: 'Mar 18 2017 09:00:00 am' }
];

// 按日期降序排列(最新的在前)
const sortedPatients = array.sort((a, b) => {
  const dateA = new Date(a.date);
  const dateB = new Date(b.date);
  // 用时间戳相减实现降序:dateB - dateA 是从新到旧,反之是从旧到新
  return dateB.getTime() - dateA.getTime();
});

console.log(sortedPatients.map(item => item.id)); 
// 输出:[4, 2, 1, 3],这是符合时间逻辑的降序结果

补充说明

  1. 为什么Date对象可以正确比较?
    new Date('Mar 12 2017 10:00:00 am')会把字符串解析成对应的时间戳(从1970年1月1日到该时间的毫秒数),通过比较时间戳的大小,就能准确判断时间的先后。
  2. 关于你提到的预期结果
    你说预期是id4, id2, id3, id1,这其实不符合时间逻辑(上午5点比上午10点早,应该排在最后),可能是笔误。上面的代码会得到符合时间顺序的降序结果:id4(3月18日)→id2(3月12日晚8点)→id1(3月12日上午10点)→id3(3月12日上午5点)。
  3. 变量名注意
    你代码里定义的数组是array,但排序时用了PatientsListArray,要确保这是同一个变量,否则会报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:14:24