Первый ответ на этот вопрос предполагает, что mongoose адаптирует дату в соответствии с часовым поясом сервера при получении данных.
Однако у меня нет этого комплимента.
Я установил часовой пояс сервера (узла) с помощью:
process.env.TZ='Europe/Paris'
Например, если я создам простую модель, такую как:
const mongoose = require("mongoose");
const testSchema = new mongoose.Schema({
myDate: { type: Date, required: true },
}, { timestamps: true });
exports.Comment = mongoose.default.model('TestSchema', testSchema);
Но если я создаю дату с 2020-01-01 20:20:20
, то при выполнении TestSchema.find()
дата будет: 2020-01-01T19:20:20.000Z
, поэтому есть две вещи, которые я не понимаю:
- Европа / Париж на самом деле UTC +2, поэтому я ожидаю, что дата будет
2020-01-01T18:20:20.000Z
в UTC или 2020-01-01T20:20:20.000Z
с часовым поясом сервера
- Как сделать так, чтобы mongoose автоматически установил дату на правильный часовой пояс?
Я знаю, что myDate
- это объект Date, поэтому я могу преобразовать его вручную, но я бы предпочел не делать это сам по простым причинам, например, забыл преобразовать одну из дат в приложении или нет необходимости делать это это каждый раз, когда Date
поле добавляется
Простое решение, о котором я могу подумать, - это зарегистрировать глобальный плагин для mongoose, который будет использовать schema.set('toJSON', ...
и schema.set('toObject', ...)
с помощью метода transform, чтобы я мог перебирать поля shema, а если поле - Date, обновите это в моем часовом поясе.
Но я вижу две проблемы с этим подходом:
- Звучит не очень хорошо с точки зрения производительности, если я запрашиваю много документов, в каждом из которых много полей
- Как вы можете видеть здесь В настоящее время я не могу зарегистрировать глобальные плагины ...
Как лучше всего получить дату в формате часового пояса сервера? Я бы предпочел хранить их в UTC, но установить час в соответствии с часовым поясом сервера.
РЕДАКТИРОВАТЬ:
Я только что увидел, что в то время как console.log(myDate)
выводит 2018-01-01T19:20:20.000Z
console.log(myDate.toString()
выводит Mon Jan 01 2018 20:20:20 GMT+0100 (Central European Standard Time)
, поэтому кажется, что это можно использовать, даже если бы я предпочел иметь объект Date
и преобразовать его в строку просто перед отправкой клиенту (потребуется некоторое форматирование, хотя этот формат не очень удобен для пользователя). Но опять же, как бы я делал это глобально, а не для каждой даты