使用Mongoose日期Schema:如何将日期输出格式化为指定简洁样式?
解决Mongoose Date字段格式化问题
嘿,这个问题我之前也碰到过,给你几个实用的解决方案,按需选就行:
方法一:查询后手动格式化输出
如果你只是偶尔需要格式化日期,直接在取出文档后处理就行,用JS原生的Date方法就能搞定:
// 假设你已经通过查询拿到了comment对象 const date = comment.date; // 生成目标格式的日期字符串 const formattedDate = `${date.toLocaleString('en-US', { weekday: 'short' })} ${date.toLocaleString('en-US', { month: 'short' })} ${date.getDate()},${date.getFullYear()}`; console.log(formattedDate); // 输出 Sun Apr 01,2018
或者用toLocaleDateString配合正则调整格式:
const formattedDate = comment.date.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', year: 'numeric' }).replace(/(\d+) (\d+)/, '$1,$2');
方法二:用Mongoose虚拟属性自动生成
如果需要频繁使用格式化后的日期,给Schema加个虚拟属性更方便,不用每次手动处理:
var commentSchema = new Schema({ text: String, author: [{ type: Schema.Types.ObjectId, ref: 'user' }], username : String, date: { type: Date, default: Date.now } }); // 添加虚拟属性formattedDate,自动返回格式化后的日期 commentSchema.virtual('formattedDate').get(function() { const date = this.date; return `${date.toLocaleString('en-US', { weekday: 'short' })} ${date.toLocaleString('en-US', { month: 'short' })} ${date.getDate()},${date.getFullYear()}`; }); // 配置让虚拟属性在JSON/Object输出中可见 commentSchema.set('toJSON', { virtuals: true }); commentSchema.set('toObject', { virtuals: true });
之后你取出comment文档时,直接访问comment.formattedDate就能得到想要的格式啦,原有的date字段还是保留Date对象,不影响其他操作。
方法三:给Date字段添加Getter函数
如果你希望直接访问comment.date就得到格式化后的字符串,可以给字段加个getter:
var commentSchema = new Schema({ text: String, author: [{ type: Schema.Types.ObjectId, ref: 'user' }], username : String, date: { type: Date, default: Date.now, get: function(value) { const date = value; return `${date.toLocaleString('en-US', { weekday: 'short' })} ${date.toLocaleString('en-US', { month: 'short' })} ${date.getDate()},${date.getFullYear()}`; } } }); // 配置让getter生效 commentSchema.set('toJSON', { getters: true }); commentSchema.set('toObject', { getters: true });
⚠️ 注意:这个方法会把原本的Date对象转换成字符串,如果你之后还需要对日期进行比较、计算等操作,虚拟属性的方法会更合适。
内容的提问来源于stack exchange,提问作者Vaibhav sood
相关产品推荐
相关产品推荐

