Node.js中修改MongoDB返回对象的日期格式为dd-mm-yyyy
如何将MongoDB查询返回的日期格式改为dd-mm-yyyy
这里提供几种实用的方法来修改activeFrom和activeUntil字段的日期格式:
方法1:手动格式化日期(无额外依赖)
直接遍历查询结果,手动拼接日期为dd.mm.yyyy格式:
// 定义通用格式化函数 const formatDate = (dateString) => { const date = new Date(dateString); // 月份从0开始,需+1;padStart确保日期为两位数 const day = String(date.getUTCDate()).padStart(2, '0'); const month = String(date.getUTCMonth() + 1).padStart(2, '0'); const year = date.getUTCFullYear(); return `${day}.${month}.${year}`; }; const getAllContracts = async (req, res) => { const contracts = await Contract.find({}); // 格式化每个合同的日期字段 const formattedContracts = contracts.map(contract => ({ ...contract.toObject(), // 将Mongoose文档转为普通JS对象 activeFrom: formatDate(contract.activeFrom), activeUntil: formatDate(contract.activeUntil) })); res.status(StatusCodes.OK).json({ contracts: formattedContracts, count: formattedContracts.length }); };
方法2:使用Mongoose虚拟字段(全局自动格式化)
如果希望所有查询都自动处理日期格式,可以在Mongoose模型中定义虚拟字段:
const mongoose = require('mongoose'); const contractSchema = new mongoose.Schema({ // 你的其他字段定义... tenant: String, manager: String, activeFrom: Date, activeUntil: Date, // ... }); // 为activeFrom添加格式化虚拟字段 contractSchema.virtual('formattedActiveFrom').get(function() { const date = new Date(this.activeFrom); const day = String(date.getUTCDate()).padStart(2, '0'); const month = String(date.getUTCMonth() + 1).padStart(2, '0'); const year = date.getUTCFullYear(); return `${day}.${month}.${year}`; }); // 为activeUntil添加格式化虚拟字段 contractSchema.virtual('formattedActiveUntil').get(function() { const date = new Date(this.activeUntil); const day = String(date.getUTCDate()).padStart(2, '0'); const month = String(date.getUTCMonth() + 1).padStart(2, '0'); const year = date.getUTCFullYear(); return `${day}.${month}.${year}`; }); // 配置模型转JSON/对象时包含虚拟字段 contractSchema.set('toJSON', { virtuals: true }); contractSchema.set('toObject', { virtuals: true }); const Contract = mongoose.model('Contract', contractSchema);
然后在接口中替换原字段:
const getAllContracts = async (req, res) => { const contracts = await Contract.find({}); const formattedContracts = contracts.map(contract => { const contractObj = contract.toObject(); // 用格式化后的字段替换原字段 contractObj.activeFrom = contractObj.formattedActiveFrom; contractObj.activeUntil = contractObj.formattedActiveUntil; // 移除虚拟字段名(可选) delete contractObj.formattedActiveFrom; delete contractObj.formattedActiveUntil; return contractObj; }); res.status(StatusCodes.OK).json({ contracts: formattedContracts, count: formattedContracts.length }); };
方法3:使用date-fns库(轻量级日期工具)
如果需要更复杂的日期处理,推荐使用轻量级库date-fns:
- 先安装依赖:
npm install date-fns
- 接口中使用:
const { format } = require('date-fns'); const getAllContracts = async (req, res) => { const contracts = await Contract.find({}); const formattedContracts = contracts.map(contract => ({ ...contract.toObject(), // 直接用date-fns的format方法生成dd.MM.yyyy格式 activeFrom: format(new Date(contract.activeFrom), 'dd.MM.yyyy'), activeUntil: format(new Date(contract.activeUntil), 'dd.MM.yyyy') })); res.status(StatusCodes.OK).json({ contracts: formattedContracts, count: formattedContracts.length }); };
内容的提问来源于stack exchange,提问作者Nazar Duma
相关产品推荐
相关产品推荐

