如何格式化来自 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

如何从存储在 mongodb 中的对象中获取日期?

在 MongoDB 中格式化默认日期模式

如何在 twig 中显示来自 Unix 时间戳的格式化日期?

本地化:如何格式化日期和数字