Как я могу установить правильный часовой пояс для поля даты в пн goose? - PullRequest
1 голос
/ 07 января 2020

Я использую момент для генерации времени и даты:

const moment = require('moment-timezone');
const emailModel = require('./api/models/emails');

sentTime=moment().tz('America/Los_Angeles').format();
console.log(sentTime);    //console log  shows correct time
emailModel.findOneAndUpdate({ _id: emailInfo._id }, {sentTime: sentTime }, { upsert: true },function (err, doc) {
  if (err)
    console.log(err);
});

И это схема, которую я использую mon goose:

const mongoose = require('mongoose');

const Schema = mongoose.Schema;
const EmailSchema = new Schema({
   .
   .
   .
    sentTime: {
        type: Date,
        trim: true
    }
   .
   .
   .
});

Проблема: в журнале консоли отображается правильное время 2020-01-07T12: 23: 00-08: 00 НО пн goose сохранен неверный часовой пояс в БД: 2020 -01-07T20: 23: 01,000 + 00: 00

1 Ответ

1 голос
/ 08 января 2020

В настоящее время поведение Mongodb по умолчанию: ( Из документов )

MongoDB сохраняет время в UT C по умолчанию и преобразует любые представления местного времени в эту форму.

В качестве решения (и это правильно) они рекомендуют следующее:

Приложения, которые должны работать или сообщать о некотором неизмененном значении местного времени, могут хранить часовой пояс вместе с меткой времени UT C и вычислите исходное местное время в их логиках приложений c.

Обновление: Поскольку вы уже используете moment-timezone a Я бы сказал go об этом:

Измените EmailSchema, чтобы иметь поле часового пояса, и создайте Mon goose виртуальное поле на этой схеме, чтобы получить скорректированное время.

const schemaOpts = { toJSON: { virtuals: true } };
const EmailSchema = new Schema(
  {
    sentTime: {
      type: Date,
      trim: true
    },
    timeZone: {
      type: String
    }
  },
  schemaOpts
);

EmailSchema.virtual("adjustedTime").get(function() {
  return moment.tz(this.sentTime, this.timeZone).format();
});

//fetching data
const result = await EmailSchema.findOne({}).exec();
console.info("result::", result.toJSON());

//note that if using .lean() for performance which has a caveat on using .toJSON()
...