如何格式化来自 MongoDB 的日期?
Posted
技术标签:
【中文标题】如何格式化来自 MongoDB 的日期?【英文标题】:How can I format a date coming from MongoDB? 【发布时间】:2012-01-30 07:56:22 【问题描述】:我正在使用 Jade 从 Express.js 中呈现我的视图。我在 MongoDB 中保存文档并使用 Mongoose 访问我的文档。我正在保存创建新文档时创建的默认日期,并将该日期创建属性返回到需要格式化的视图。存储在 MongoDB 中的日期格式为:
Thu Dec 29 2011 20:14:56 GMT-0600 (CST)
我的问题是:如何在从 MongoDB 返回的 Jade(或 Mongoose 或 Node.JS)中格式化这个日期?
【问题讨论】:
【参考方案1】:我正好有这个要求(expressjs、mongoose、jade),这就是我自己解决的方法。
首先我安装了momentjs 和npm install moment
。
然后我用这个来查看:
var moment = require('moment');
app.get('/', function(req, res)
// find all jobs using mongoose model
Job.find().exec(function(err, items)
// pass moment as a variable
res.render('status', 'jobs': items, moment: moment );
)
);
然后在 Jade 中这样使用它:
table
tr
td Subject
td Posted at
td Status
each job, i in jobs
tr
td #job.subject
td #moment(job.postedAt).format("YYYY-MM-DD HH:mm")
td #job.status
【讨论】:
太棒了!最佳答案恕我直言! @s3v3n 你是上帝。这挽救了我的一天。沮丧了 3-4 个小时。【参考方案2】:javascript 内置了对日期的支持。首先,将您的字符串放入 Date 对象中:
date = new Date('Thu Dec 29 2011 20:14:56 GMT-0600 (CST)')
现在你可以在日期上使用各种方法来获取你需要的数据:
date.toDateString() // "Thu Dec 29 2011"
date.toUTCString() // "Fri, 30 Dec 2011 02:14:56 GMT"
date.getMonth() // 11
date.getDate() // 29
date.getFullYear() // 2011
你可以看到更多的方法on the MDN reference site。您可以使用这些方法来构建您想要的任何类型的字符串。
要获得更强大的日期/时间解析、格式化和操作,您绝对应该查看 s3v3n 在另一个答案中提到的Moment.js。
【讨论】:
伙计,这使得在显示日期时处理日期变得很麻烦:( 如图所示,date.getMonth() 返回 11 表示 12 月。如果要显示它,您可能希望使用 date.getMonth()+1。 getYear() 已弃用,请改用 getFullYear()。【参考方案3】:我猜你还没有尝试过简单的方法?
#storeddate.toDateString()
【讨论】:
或者,删除星期几... #storeddate.toDateString().substr(4,12)【参考方案4】:实际上,您不需要在 Mongoose 架构中使用其他属性来存储创建日期,因为 _id
具有该信息。相反,您可以在 Mongoose 架构上创建 virtual,如下所示:
YourSchema.virtual('date')
.get(function()
return this._id.generationTime;
);
这会将原始 Javascript 日期作为每个文档的 .date
属性返回。
然后您可以更进一步,在虚拟中按照您想要的方式格式化日期:
YourSchema.virtual('date')
.get(function()
return this._id.generationTime.toDateString();
);
【讨论】:
+1 表示存储 generationTime 是多余的,-1 表示建议创建虚拟日期。这显然是一个显示值的问题,所以视图应该处理这个。【参考方案5】:这是一个关于如何做到这一点的示例(使用 EJS)
<%
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
var d = post.date.getDate();
var m = monthNames[post.date.getMonth()];
var y = post.date.getFullYear();
%>
现在您可以像这样使用这些变量...
<small style="color: red"><%= post.date %></small>
来源: https://medium.com/@littlelostify/how-to-format-mongoose-crappy-date-10df67d7a2d6
【讨论】:
【参考方案6】:我的解决办法是:
将 momentjs 添加到您的 express 应用程序本地,如下所示:app.locals.moment = require('moment');
那么你就可以在任何jade文件中使用moment了:span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'
参考: Making use of utility libraries in server-side Jade templates
【讨论】:
【参考方案7】:非常简单的方法步骤-
通过 npm moment --save 安装
声明 var moment = require('moment');
在res.render'filename.ejs'中定义declare变量,moment: moment);
把这个 ejs 放到你的视图文件中
输出是—— 2017 年 6 月 9 日
您可以更改格式,在链接中查看不同格式http://momentjs.com/
【讨论】:
以上是关于如何格式化来自 MongoDB 的日期?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 mongodb php 中以 ISODATE 格式存储当前日期和时间?
来自环回的 mongodb 中格式为 yyyy--mm-dd 的字符串日期上的 gte