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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 11:10:19