Мангуста дата-время и часовой пояс, как получить дату-время на основе часового пояса сервера - PullRequest
0 голосов
/ 19 апреля 2019

Первый ответ на этот вопрос предполагает, что 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 и преобразовать его в строку просто перед отправкой клиенту (потребуется некоторое форматирование, хотя этот формат не очень удобен для пользователя). Но опять же, как бы я делал это глобально, а не для каждой даты

1 Ответ

1 голос
/ 21 апреля 2019

Несколько вещей:

  • Europe/Paris в 2020-01-01T20:20:20 - это UTC + 1.Он не переключается на UTC + 2, пока не наступит летнее время 29 марта. Ссылка здесь .Таким образом, преобразование в 2020-01-01T19:20:20Z является правильным.

  • Вывод console.log при передаче объекта Date зависит от реализации.Некоторые реализации будут выдавать вывод .toString() (который находится по местному времени в формате RFC 2822 ), а некоторые будут выдавать вывод .toISOString() (который находится в UTC в ISO 8601 расширенный формат).Вот почему вы видите разницу.

  • Как правило, отправлять местное время без отправки смещения часового пояса нецелесообразно.Формат ISO 8601 идеален, но вы должны отправить либо 2020-01-01T19:20:20Z, либо 2020-01-01T20:20:20+01:00.Не просто отправьте дату и время без смещения клиенту.В противном случае, если ваш клиент может находиться в другом часовом поясе, он будет неправильно интерпретировать значение.

  • Имейте в виду, что Date объекты не часовой поясосознанный.Они содержат только внутреннюю временную метку Unix и преобразовывают только в местный часовой пояс системы для функций, которые работают по местному времени.Они не могут работать в любом другом часовом поясе.

  • Использование локального часового пояса системы вредно для переносимости.Не всегда есть возможность изменить его, и это не очень хорошо, когда вам приходится работать в нескольких часовых поясах.Было бы лучше, если бы не зависело от установки местного часового пояса из переменной TZ узла.Вместо этого рассмотрите возможность написания своего кода независимо от настроек местного часового пояса.

  • Библиотека данных о часовых поясах может помочь в большинстве ваших проблем.Я могу порекомендовать Luxon , js-Joda , Момент + Момент-часовой пояс или date-fns + date-fns-timezone .

  • "Как бы я сделал это глобально" - это то, чего я не придерживаюсь в вашем вопросе.Попробуйте подход, который я описал, и если у вас все еще есть проблемы, откройте новый вопрос.Попытайтесь быть конкретным и задайте один вопрос.Скорее всего, вы получите лучшие результаты.Пожалуйста, прочитайте Как мне задать хороший вопрос? и Как создать пример Minimal, Complete и Verifiable .Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...