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

NodeJS实现总分钟数转小时分钟格式并存储至MongoDB

解决方案

1. 修改MongoDB模型(attendanceModel.js)

先调整数据模型,新增一个字符串类型字段来存储格式化后的工作时长,同时保留数字类型的总分钟数方便后续统计:

const mongoose = require("mongoose")

const attendanceSchema = new mongoose.Schema({
    employee: {
        type: mongoose.Schema.ObjectId,
        ref: "Employee"
    },
    date: {
        type: String,
        unique: false
    },
    checkInTime: {
        type: Date
    },
    checkOutTime: {
        type: Date
    },
    workMinutes: { // 保留总分钟数字段,用于统计计算
        type: Number
    },
    formattedWorkHours: { // 存储格式化后的时长字符串
        type: String
    },
    notes: {
        type: String
    }
})

const Attendance = mongoose.model("Attendance", attendanceSchema)
module.exports = Attendance

2. 更新签退逻辑(attendanceController.js)

在计算出总分钟数后,拆分小时和分钟,拼接成目标格式,再写入数据库:

exports.checkOutAttendance = catchAsync(async (req, res, next) => {
const employee = await User.findById(req.user?.id);
const currentDate = format(new Date(), "dd-MM-yyyy");

if (!employee) {
    return next(new AppError("Employee not found or not LoggedIn", 404));
}

const existingAttendance = await Attendance.findOne({
    employee: employee._id,
    date: currentDate
});

if (!existingAttendance || !existingAttendance.checkInTime) {
    return next(new AppError("You have not checkedIn for today", 400));
}

const checkInTime = existingAttendance.checkInTime;
const checkOutTime = Date.now();
const workHoursMillis = checkOutTime - checkInTime;

const totalMinutes = Math.floor(workHoursMillis / (1000 * 60));
// 拆分小时和分钟
const hours = Math.floor(totalMinutes / 60);
const minutes = totalMinutes % 60;
// 拼接成指定格式
const formattedWorkHours = `${hours} Hours & ${minutes} Minutes`;

const checkedOut = await Attendance.findByIdAndUpdate(existingAttendance._id, {
    checkOutTime: checkOutTime,
    workMinutes: totalMinutes,
    formattedWorkHours: formattedWorkHours,
    notes: "CheckedOut Successfully"
}, { new: true }); // 返回更新后的文档

res.status(200).json({
    status: 'success',
    data: {
        data: checkedOut
    }
});
});

补充说明

  • 如果不需要后续统计总工时,也可以删除workMinutes字段,只保留formattedWorkHours存储格式化结果。
  • 添加{ new: true }选项是为了让接口返回更新后的完整数据,方便前端查看格式化后的工作时长。

内容的提问来源于stack exchange,提问作者Abhi Patoliya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 23:21:17