naivedeveloper
naivedeveloper

Reputation: 2958

How can I format a date coming from MongoDB?

I'm using Jade to render my views from within Express.js. I am saving documents in MongoDB and using Mongoose to access my documents. I am saving a default date created when a new document is created and I am returning that date created attribute to the view, where is needs to be formatted. The format of the date being stored within MongoDB is:

Thu Dec 29 2011 20:14:56 GMT-0600 (CST)

My question is: How do I format this date in Jade (or Mongoose or Node.JS) coming back from MongoDB?

Upvotes: 42

Views: 91451

Answers (7)

Y. Joy Ch. Singha
Y. Joy Ch. Singha

Reputation: 3252

very easy method steps-

  1. install via npm moment --save

  2. declare var moment = require('moment');

  3. define the declare variable in res.render'filename.ejs',{moment: moment});

  4. put this ejs in your view file <%= moment(data.column_name_of_your_date).format( 'DD MMM YYYY'); %>

output is -- 09 Jun 2017

you can changed the format check it out in moment link for different format http://momentjs.com/

Upvotes: 0

Michelle Tilley
Michelle Tilley

Reputation: 159105

JavaScript has built-in support for dates. First, to get your string into a Date object:

date =  new Date('Thu Dec 29 2011 20:14:56 GMT-0600 (CST)')

Now you can use various methods on the date to get the data you need:

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

You can see more methods on the MDN reference site. You can use these methods to build any kind of string you want.

For more robust date/time parsing, formatting, and manipulation, you should definitely check out Moment.js as mentioned by s3v3n in another answer.

Upvotes: 62

AmJustSam
AmJustSam

Reputation: 268

Here's an example on how can do that (Using 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();

    %>

Now You Can Use These Variables Like This...

<small style="color: red"><%= post.date  %></small>

Source: https://medium.com/@littlelostify/how-to-format-mongoose-crappy-date-10df67d7a2d6

Upvotes: 2

Zhifeng Hu
Zhifeng Hu

Reputation: 1261

My solution is:

Add momentjs to your express application locals like this:
app.locals.moment = require('moment');

Then you can use moment in any jade files:
span='(Created at: ' + moment(obj.createTime).format("YYYY/MM/DD") + ')'

Reference: Making use of utility libraries in server-side Jade templates

Upvotes: 0

Wes Brown
Wes Brown

Reputation: 171

I guess you haven't tried the easy way?

#{storeddate.toDateString()}

Upvotes: 16

s3v3n
s3v3n

Reputation: 8446

I had exactly this requirements (expressjs, mongoose, jade) and this is how I solved it for myself.

First of all I installed momentjs with npm install moment. Then I passed moment to view using this:

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 });
    })
});

Then using it like this in 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}

Upvotes: 65

danmactough
danmactough

Reputation: 5484

Actually, you don't need another attribute in your Mongoose schema to store the creation date, as the _id has that information. Instead, you can create a virtual on your Mongoose schema, like this:

YourSchema.virtual('date')
  .get(function() {
    return this._id.generationTime;
  });

That would return the raw Javascript date as the .date attribute for each document.

Then you can take that one step further and format the date you way you want to in that virtual:

YourSchema.virtual('date')
  .get(function() {
    return this._id.generationTime.toDateString();
  });

Upvotes: 6

Related Questions