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

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:

  1. 先安装依赖:
npm install date-fns
  1. 接口中使用:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 14:45:28