如何在JavaScript中仅按时间对日期对象数组排序?
按时间部分排序对象数组(忽略日期)
你有这样一个包含日期时间字符串的对象数组:
const data = [ { _id: 1, date: '2018-05-04T12:28:00-07:00' }, //12:28pm { _id: 2, date: '2018-04-29T08:24:00-07:00' }, //8:24am { _id: 3, date: '2018-05-04T10:29:00-07:00' } //10:29am ];
想要仅按时间部分排序,忽略日期,得到这样的结果:
[ { _id: 2, date: '2018-04-29T08:24:00-07:00' }, //8:24am { _id: 3, date: '2018-05-04T10:29:00-07:00' }, //10:29am { _id: 1, date: '2018-05-04T12:28:00-07:00' } //12:28pm ]
实现思路
核心是从每个date字符串中提取HH:mm:ss格式的时间部分,因为ISO标准的时间字符串本身可以直接按字符顺序比较大小,不需要额外转换为时间戳或日期对象。
代码实现
你可以用数组的sort()方法结合字符串截取来实现:
// 先复制原数组,避免修改原数据(不需要保留原数组的话可以直接用data.sort()) const sortedData = [...data].sort((a, b) => { // 提取时间部分:从T之后到时区偏移符号之前的内容 const timeA = a.date.slice(a.date.indexOf('T') + 1, a.date.indexOf('-')); const timeB = b.date.slice(b.date.indexOf('T') + 1, b.date.indexOf('-')); // 直接比较时间字符串的顺序 return timeA.localeCompare(timeB); }); console.log(sortedData);
通用化优化(兼容+时区偏移)
如果你的日期字符串可能出现+号时区偏移(比如2018-05-04T12:28:00+08:00),可以把提取时间的逻辑封装成更通用的函数:
const extractTimePart = (dateStr) => { const tPosition = dateStr.indexOf('T'); // 找到时区符号的位置,兼容+和-两种情况 const zonePosition = dateStr.includes('+') ? dateStr.indexOf('+') : dateStr.indexOf('-'); return dateStr.slice(tPosition + 1, zonePosition); }; const sortedData = [...data].sort((a, b) => { return extractTimePart(a.date).localeCompare(extractTimePart(b.date)); });
内容的提问来源于stack exchange,提问作者chubbychu
相关产品推荐
相关产品推荐

