Home > other >  There is no calibration between MongoDB UTC time and local time
There is no calibration between MongoDB UTC time and local time

Time:01-19

Data is stored and inquired through the API on the web page, and the API is using MongoDB.

The server space has been unified to UTC time so that the same results can be achieved in different time zones.

MongoDB uses the Mongoose schema as follows:

    const userSchema = new Schema({
     userId : {
      type : String
     },
     score : {
      type : Number
     },
     createdAt : {
      type : Date,
      default : Date.now
     }
    });

Because Date.now in the schema is in the createdAt field by default, it does not pass the Date value separately when querying the create or update of mongoose.

Considering the case where offset exists based on UTC time, the time is calculated using moment.js as follows:

    // -540 offset value for KST 9 hours faster than UTC
    const utc= moment.utc().add(offset, 'm').format('YYYY-MM-DDTHH:mm:ssZ');
    
    let beginDate = new Date(utc);
    let endDate = null;
    let year = beginDate.getFullYear();
    let month = beginDate.getMonth();
    let date = beginDate.getDate();
    
    // To view the full duration of the day
    beginDate = new Date(new Date(year, month, date).setHours(0, 0, 0, 0));
    endDate = new Date(new Date(year, month, date).setHours(23, 59, 59, 59));
    
    // Find document
    const user = await userSchema.aggregate([
     {
      $unwind : 'lists'
     },
     {
      $match : {
       'lists.createdAt' : {
         $gte : beginDate,
         $lte : endDate
       }
      }
     },
     ...
    ]);

For example, if you make a query in Korea, the data inquiry may differ from the time after midnight and to 9 a.m. the next day.

What is wrong with the above parallax correction logic? I don't exactly understand the current problem.

CodePudding user response:

Why so difficult? Simply use

{
  $match : {
   'lists.createdAt' : {
     $gte : moment().startOf('day').toDate(),
     $ltr : moment().endOf('day').toDate()
   }
  }
 }

moment().startOf('day').toDate() returns the begin of current day in your local time zone. I live in Switzerland, thus it returns ISODate("2023-01-17T23:00:00.000Z")

But you can specify also a time zone, e.g.

moment.tz('Asia/Seoul').startOf('day').toDate();
ISODate("2023-01-17T15:00:00.000Z")

The problem is moment.utc().add(...) really modifies the time value. But that is not what you need to do, you like to change only the way how the time is displayed in your local time zone.

For comparison and calculations, the displayed value does not matter. All methods are done in UTC time only.

  • Related