Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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?

like image 822
naivedeveloper Avatar asked Dec 30 '11 02:12

naivedeveloper


People also ask

What format does MongoDB store dates?

The DATE type in MongoDB can store date and time values as a combined unit. The BSON Date type is a signed 64-bit integer representing the number of milliseconds since the Unix epoch (Jan 1, 1970).

Does MongoDB convert date to UTC?

MongoDB stores times in UTC by default, and will convert any local time representations into this form. Applications that must operate or report on some unmodified local time value may store the time zone alongside the UTC timestamp, and compute the original local time in their application logic.

Is there a date type in MongoDB?

The recommended way to store dates in MongoDB is to use the BSON Date data type. , which was 00:00:00 UTC on 1 January 1970. This provides a lot of flexibilty in past and future dates. With a 64-bit integer in use, we are able to represent dates roughly 290 million years before and after the epoch.


2 Answers

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} 
like image 181
s3v3n Avatar answered Oct 06 '22 22:10

s3v3n


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.

like image 45
Michelle Tilley Avatar answered Oct 06 '22 22:10

Michelle Tilley