如何基于纳秒参数计算数据库条目注册后的已流逝时间
解析基于纳秒时间计算流逝时长的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`; }按优先级返回文本:有小时则显示小时前,否则显示分钟前,最后显示秒前(文本为葡萄牙语)。
注意事项
- 总时长超过24小时的问题:如果创建时间距离当前超过1天,
duration.hours()只会返回当天剩余的小时数(比如25小时只会显示1小时前),如果需要显示总小时数,应该用duration.asHours()来获取总时长并取整。 - Moment.js的状态:Moment.js目前已进入维护模式,不再新增功能,推荐使用Day.js、Luxon等替代方案,或直接使用浏览器原生的
DateAPI实现类似逻辑。
内容的提问来源于stack exchange,提问作者Ana Apresentação
相关产品推荐
相关产品推荐

