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

如何基于纳秒参数计算数据库条目注册后的已流逝时间

解析基于纳秒时间计算流逝时长的Moment.js代码逻辑

这个函数的核心作用是:接收纳秒级的创建时间戳,计算该时间到当前时刻的流逝时长,最终返回格式化的葡语文本(小时/分钟/秒前)。下面逐行拆解逻辑:

代码分步解析

  • 参数接收与调试:

    const getHoursOrMinutesAgo = (createdAtNanos) => {
        console.log(createdAtNanos)
    

    定义函数并接收纳秒时间参数createdAtNanos,console.log用于调试输出传入的原始纳秒值。

  • 时间初始化:

    const now = moment();
    const createdAtMilliseconds = createdAtNanos / 1000000; 
    const createdAt = moment(createdAtMilliseconds);
    
    • moment()创建当前时间的Moment实例;
    • 由于Moment默认只支持毫秒级时间戳,所以把纳秒除以1000000(1毫秒=1,000,000纳秒),转换成毫秒时间戳;
    • 用转换后的毫秒数创建创建时间的Moment实例createdAt。
  • 计算时间差并转换为时长对象:

    const duration = moment.duration(now.diff(createdAt));
    
    • now.diff(createdAt)计算当前时间与创建时间的差值,返回毫秒数;
    • moment.duration()把毫秒差值包装成时长对象,方便提取小时、分钟、秒等单位。
  • 提取各单位时长:

    const hoursAgo = duration.hours();
    const minutesAgo = duration.minutes();
    const secondsAgo = duration.seconds();
    

    注意:这里提取的是当前层级的剩余时长,不是总时长:

    • duration.hours():返回不足1天的小时数(比如总时长25小时,这里只返回1);
    • duration.minutes():返回不足1小时的分钟数;
    • duration.seconds():返回不足1分钟的秒数。
  • 判断并返回格式化文本:

    if (hoursAgo > 0) {
       return `${hoursAgo} hora(s) atrás`;
    } else if (minutesAgo > 0) {
       return `${minutesAgo} minuto(s) atrás`;
    } else {
       return `${secondsAgo} segundo(s) atrás`;
    }
    

    按优先级返回文本:有小时则显示小时前,否则显示分钟前,最后显示秒前(文本为葡萄牙语)。

注意事项

  1. 总时长超过24小时的问题:如果创建时间距离当前超过1天,duration.hours()只会返回当天剩余的小时数(比如25小时只会显示1小时前),如果需要显示总小时数,应该用duration.asHours()来获取总时长并取整。
  2. Moment.js的状态:Moment.js目前已进入维护模式,不再新增功能,推荐使用Day.js、Luxon等替代方案,或直接使用浏览器原生的Date API实现类似逻辑。

内容的提问来源于stack exchange,提问作者Ana Apresentação

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 16:13:41