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

MongoDB/Mongoose查询结果中如何格式化ISODate日期?

解决MongoDB日期在Handlebars中格式化为dd/mm/yyyy的问题

嘿,我来帮你搞定这个日期显示的问题!你现在看到的是JavaScript Date对象默认的toString()输出,要改成dd/mm/yyyy格式有几种实用的办法,我给你详细说说:

方法一:查询后手动处理数据

因为你用了.lean()返回普通JavaScript对象,所以可以在渲染前遍历数据,把日期转成需要的格式:

var query = await Pedido.find().populate('cliente').lean().exec();

// 遍历每个订单,添加格式化后的日期字段
query.forEach(pedido => {
  const date = new Date(pedido.date);
  // 补零确保两位数(比如8变成08)
  const day = String(date.getDate()).padStart(2, '0');
  // 月份是从0开始的,所以要加1
  const month = String(date.getMonth() + 1).padStart(2, '0');
  const year = date.getFullYear();
  
  pedido.formattedDate = `${day}/${month}/${year}`;
});

res.render("admin/pedidos", { pedidos: query });

然后在Handlebars模板里替换成新的字段:

{{#each pedidos}}
 <h5 class="ordem1">Pedido #{{id}} <small>{{formattedDate}}</small></h5>
{{/each}}

方法二:自定义Handlebars Helper(推荐,复用性强)

如果你的项目里很多地方都需要格式化日期,自定义一个Handlebars Helper会更方便,不用每次都手动处理数据:

首先在你的Express配置文件(比如app.js)里注册这个Helper:

const handlebars = require('express-handlebars');

// 配置Handlebars并注册自定义Helper
app.engine('handlebars', handlebars({
  helpers: {
    formatDate: function(date) {
      const d = new Date(date);
      const day = String(d.getDate()).padStart(2, '0');
      const month = String(d.getMonth() + 1).padStart(2, '0');
      const year = d.getFullYear();
      return `${day}/${month}/${year}`;
    }
  }
}));
app.set('view engine', 'handlebars');

然后直接在模板里调用这个Helper:

{{#each pedidos}}
 <h5 class="ordem1">Pedido #{{id}} <small>{{formatDate date}}</small></h5>
{{/each}}

方法三:通过Mongoose Schema自动转换

如果你希望所有查询返回的date字段都自动变成目标格式,可以在Schema里设置transform规则。注意:这个方法适用于**不使用.lean()**的情况,因为.lean()会跳过Mongoose的文档转换逻辑:

修改你的Schema:

const Pedido = new Schema({
  id: { type: String, required: true },
  cliente: { type: Schema.Types.ObjectId, ref: 'clientes', required: true },
  date: { type: Date }
}, {
  // 转换JSON格式时自动处理日期
  toJSON: {
    transform: function(doc, ret) {
      const date = new Date(ret.date);
      ret.date = `${String(date.getDate()).padStart(2, '0')}/${String(date.getMonth()+1).padStart(2, '0')}/${date.getFullYear()}`;
      return ret;
    }
  },
  // 转换普通对象时自动处理日期
  toObject: {
    transform: function(doc, ret) {
      const date = new Date(ret.date);
      ret.date = `${String(date.getDate()).padStart(2, '0')}/${String(date.getMonth()+1).padStart(2, '0')}/${date.getFullYear()}`;
      return ret;
    }
  }
});

mongoose.model('pedidos', Pedido);

然后查询时去掉.lean():

var query = await Pedido.find().populate('cliente').exec();
res.render("admin/pedidos", { pedidos: query });

这样模板里直接用{{date}}就会显示dd/mm/yyyy格式啦!

内容的提问来源于stack exchange,提问作者Marcel Streicher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 08:32:40