JavaScript实现时间数组按当前时间排序,优先返回距离最近的时间
实现思路
- 先把
HH:mm:ss格式的时间字符串、当前时间都转换为从当天0点开始计算的总秒数,简化时间大小比较逻辑 - 将待排序数组拆分为两组:小于等于当前时间的过去时间组
pastArr、大于当前时间的未来时间组futureArr pastArr按秒数降序排序,取排在首位的最大元素(即离当前时间最近的过去时间)作为结果第一个元素- 后续依次拼接升序排序的
futureArr、以及反转后按升序排列的剩余pastArr元素即可
完整实现代码
// 辅助工具:将HH:mm:ss格式时间转换为当天总秒数 function timeToSec(timeStr) { const [hours, minutes, seconds] = timeStr.split(':').map(Number) return hours * 3600 + minutes * 60 + seconds } function createTimeSort(currentTime, timeArray) { // 转换当前时间为当天总秒数 const currentSec = currentTime.getHours() * 3600 + currentTime.getMinutes() * 60 + currentTime.getSeconds() // 给每个时间字符串绑定对应的秒数值 const timeWithSec = timeArray.map(item => ({ text: item, sec: timeToSec(item) })) // 拆分过去、未来两组并分别排序 const pastArr = timeWithSec.filter(item => item.sec <= currentSec).sort((a, b) => b.sec - a.sec) const futureArr = timeWithSec.filter(item => item.sec > currentSec).sort((a, b) => a.sec - b.sec) const result = [] if (pastArr.length) { // 最近的过去时间排首位 result.push(pastArr[0].text) // 拼接未来时间(升序) result.push(...futureArr.map(item => item.text)) // 拼接剩余过去时间(升序) result.push(...pastArr.slice(1).reverse().map(item => item.text)) } else { // 没有过去时间时直接返回升序的未来时间 result.push(...futureArr.map(item => item.text)) } return result }
测试验证
const data = ["06:30:00", "09:00:00", "11:30:00", "13:00:00", "14:30:00", "15:00:00", "17:30:00", "18:00:00"] // 测试示例1:当前时间13:40 const current1 = new Date() current1.setHours(13, 40, 0) console.log(createTimeSort(current1, data)) // 输出:["13:00:00","14:30:00","15:00:00","17:30:00","18:00:00","06:30:00","09:00:00","11:30:00"] // 测试示例2:当前时间17:50 const current2 = new Date() current2.setHours(17, 50, 0) console.log(createTimeSort(current2, data)) // 输出:["17:30:00","18:00:00","06:30:00","09:00:00","11:30:00","13:00:00","14:30:00","15:00:00"]
内容的提问来源于stack exchange,提问作者Jakegarbo
相关产品推荐
相关产品推荐

