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

