【问题标题】:How can I format a date coming from MongoDB?如何格式化来自 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)中格式化这个日期?

【问题讨论】:

    标签: node.js mongoose express


    【解决方案1】:

    我正好有这个要求(expressjs、mongoose、jade),这就是我自己解决的方法。

    首先我安装了momentjsnpm 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】:

        非常简单的方法步骤-

        1. 通过 npm moment --save 安装

        2. 声明 var moment = require('moment');

        3. 在res.render'filename.ejs'中定义declare变量,{moment: moment});

        4. 把这个 ejs 放到你的视图文件中

        输出是—— 2017 年 6 月 9 日

        您可以更改格式,在链接中查看不同格式http://momentjs.com/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-13
          • 1970-01-01
          • 2015-05-21
          • 1970-01-01
          • 1970-01-01
          • 2013-06-16
          相关资源
          最近更新 更多