如何在Mongoose中计算时间戳差值并将其添加到接口响应中
实现方案
完整代码
// 时间差格式化工具:输入毫秒数,返回HH:mm:ss格式字符串 const formatTimeDiff = (ms) => { const totalSeconds = Math.floor(Math.abs(ms) / 1000); const hours = String(Math.floor(totalSeconds / 3600)).padStart(2, '0'); const minutes = String(Math.floor((totalSeconds % 3600) / 60)).padStart(2, '0'); const seconds = String(totalSeconds % 60).padStart(2, '0'); // 如果需要保留正负号,可在这里判断ms<0时加前缀'-' return `${hours}:${minutes}:${seconds}`; } const attendanceInfo = await Attendance.find({ student: studentId, }) .populate('class', 'createdAt') .lean(); // 查询时直接返回普通JS对象,可直接修改,性能更高 // 遍历每条考勤记录计算差值 const result = attendanceInfo.map(record => { const classCreatedAt = new Date(record.class.createdAt).getTime(); const attendanceCreatedAt = new Date(record.createdAt).getTime(); // 如需严格按照「班级创建时间减考勤创建时间」,此处改为 classCreatedAt - attendanceCreatedAt 即可 const diffMs = attendanceCreatedAt - classCreatedAt; return { ...record, difference: formatTimeDiff(diffMs) } }) res.json({ data: result });
关键说明
- Mongoose 默认返回的查询结果是
Document实例,属于只读结构,直接新增属性不会生效。加lean()方法可以让查询直接返回普通JS对象,也可以通过遍历调用doc.toObject()的方式转成普通对象再修改。 - 计算时间差前需要先把ISO格式的时间字符串转成毫秒级时间戳再做运算。
padStart(2, '0')用于保证时分秒都为两位长度,不足时自动补前导0,符合要求的格式。- 如果你确实需要严格计算「班级创建时间减考勤创建时间」,调整差值计算的顺序即可,需要显示负数的话去掉
formatTimeDiff里的Math.abs即可。
内容的提问来源于stack exchange,提问作者Areeba Akhtar
相关产品推荐
相关产品推荐

