如何用JavaScript结合Moment.js获取时间对象中的最近时间
如何用Moment.js找到对象中距离当前时间最近的下一个祈祷时间?
假设我们有如下包含祈祷时间的对象:
var prayerTimes = { "Fajr": "04:29 (WIB)", "Sunrise": "05:39 (WIB)", "Dhuhr": "11:43 (WIB)", "Asr": "14:48 (WIB)", "Sunset": "17:48 (WIB)", "Maghrib": "17:48 (WIB)", "Isha": "18:53 (WIB)", "Imsak": "04:19 (WIB)", "Midnight": "23:43 (WIB)", "Firstthird": "21:45 (WIB)", "Lastthird": "01:42 (WIB)" };
需求是:给定当前时间,找到对象中最近的下一个时间点(比如当前时间为11:00时,结果应为11:43的Dhuhr),可以借助Moment.js的diff方法实现,具体步骤如下:
实现步骤
处理时间字符串,转换为Moment对象
从每个时间字符串中提取出HH:mm部分,转换为Moment对象。注意部分时间(比如Lastthird的01:42)属于第二天,需要判断是否要追加一天。筛选出当前时间之后的候选时间
对每个祈祷时间,比较它与当前时间的大小:如果当天的该时间已经过去,就将其设置为第二天的同一时间,保证只处理未来的时间点。计算差值并找到最近的时间
用diff方法计算每个候选时间与当前时间的毫秒差,找出差值最小的那个时间点,就是目标结果。
完整代码示例
// 获取当前时间 const now = moment(); // 处理祈祷时间,生成包含名称和对应Moment对象的数组 const processedTimes = Object.entries(prayerTimes).map(([name, timeStr]) => { // 提取HH:mm部分 const timeOnly = timeStr.match(/\d{2}:\d{2}/)[0]; // 创建当天的时间对象 let prayerTime = moment(timeOnly, "HH:mm"); // 如果该时间已经在当前时间之前,设置为第二天的同一时间 if (prayerTime.isBefore(now)) { prayerTime.add(1, 'day'); } return { name: name, time: prayerTime, // 计算与当前时间的毫秒差 diff: prayerTime.diff(now) }; }); // 找到差值最小的时间点(即最近的下一个时间) const nearestNextTime = processedTimes.reduce((prev, curr) => { return curr.diff < prev.diff ? curr : prev; }); // 输出结果 console.log(`最近的下一个祈祷时间是:${nearestNextTime.name} - ${nearestNextTime.time.format("HH:mm")}`);
代码说明
moment(timeOnly, "HH:mm"):将提取出的HH:mm字符串转换为当天的Moment对象。prayerTime.isBefore(now):判断该时间是否已经过去,过去则加一天,避免拿到已过期的时间。prayerTime.diff(now):计算两个时间的毫秒差,差值越小说明时间越近。reduce方法:遍历数组,筛选出差值最小的元素,也就是最近的下一个时间点。
内容的提问来源于stack exchange,提问作者Chandra Syahputra
相关产品推荐
相关产品推荐

