Search code examples
javascriptnode.jsmongodbmongoosemongoose-schema

Why does ISO date in Mongodb display one day earlier?


The stored date looks like this:

...
"date_of_birth" : ISODate("1920-01-02T00:00:00Z"),
...

Using moment, it is formatted in the model (in order to populate the input for updating the document) like this:

   AuthorSchema
   .virtual('date_of_birth_update_format')
   .get(function(){
      // format in JavaScript date format (YYYY-MM-DD) to display in input type="date"
      return this.date_of_birth ? moment(this.date_of_birth).format('YYYY-MM-DD') : '';
   });

Retrieved from the collection and displayed, it displays as one day earlier like this:

01/01/1920

I would appreciate any help to resolve this.


Solution

  • The date from mongo is always in GMT, and your server might be in other timezone. You need to convert date to GMT before formatting.

    var moment = require("moment-timezone")
    
    AuthorSchema.virtual('date_of_birth_update_format').get(function(){
     return this.date_of_birth ? moment(this.date_of_birth).tz('GMT').format('YYYY-MM-DD') : '';
    });