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

