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

如何用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方法实现,具体步骤如下:


实现步骤

  1. 处理时间字符串,转换为Moment对象
    从每个时间字符串中提取出HH:mm部分,转换为Moment对象。注意部分时间(比如Lastthird的01:42)属于第二天,需要判断是否要追加一天。

  2. 筛选出当前时间之后的候选时间
    对每个祈祷时间,比较它与当前时间的大小:如果当天的该时间已经过去,就将其设置为第二天的同一时间,保证只处理未来的时间点。

  3. 计算差值并找到最近的时间
    用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 09:30:45