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
相关产品推荐
相关产品推荐

