Сохранение даты клиента как объекта даты UTC в Mongo

78
10

Я пытаюсь сохранить дату в meteor mongodb, моя задача заключается в следующем:
1) если я использую новую Date(), он создает объект даты в mongo DB, но это экономит время как локальное время, как javascript Date(), которое всегда приходит с часовым поясом + 0x: часов на основе локального часового пояса браузера. Когда я получаю это, он вызывает хаос, поскольку я предполагаю, что все в моем db является UTC.


2) Я хочу использовать библиотеку времени js, что отлично, потому что она может представлять даты в UTC правильно, но моя задача - как я могу получить mongo db, чтобы принять момент? В тот момент, когда я использую moment.format(), он сохраняет его как строку!


Итак, как я могу отправить дату в команду вставки mongodb с объектом даты, который находится в UTC? строка просто не работает: (


Любая помощь будет оценена.


Спасибо

спросил(а) 2014-06-04T18:30:00+04:00 6 лет, 1 месяц назад
1
Решение
88

Я думаю, что все, что вам нужно знать обо всех этих вопросах, можно найти здесь здесь и здесь.


TL;DR:

    Если вы непосредственно вставляете/обновляете клиент, вы храните временную метку на основе пользовательских часов. Он по-прежнему будет храниться как UTC, но вы можете или не хотите доверять тому, что время правильное. Я настоятельно рекомендую использовать метод для любых модификаций db, которые включают время, чтобы всегда использовать серверную версию времени.


    Моментные объекты не могут быть сериализованы в формате, совместимом с mongodb. Используйте объект даты и отформатируйте его на клиенте.


ответил(а) 2014-06-04T20:11:00+04:00 6 лет, 1 месяц назад
39

Сообщество Метеор недавно начало обширный документ о том, как использовать даты и время. Вы найдете там много полезной информации, помимо ссылок Дэвида Уэлдона:


https://meteor.hackpad.com/Meteor-Cookbook-Using-Dates-and-Times-qSQCGFc06gH


Однако, в частности, я рекомендую использовать https://github.com/mizzao/meteor-timesync, когда безопасность не вызывает беспокойства. Он позволяет локально получать точное время сервера, даже если часы-клиенты отключены, без кругового перехода на сервер. Это может быть полезно по любым причинам: в моих приложениях я универсально использую время, относящееся к серверу, и не заботится о том, что время клиента вообще отсутствует.

ответил(а) 2014-06-05T15:27:00+04:00 6 лет, 1 месяц назад
39

Проблема с датами сохранения на клиенте заключается в том, что у каждого клиента может быть другой часовой пояс или даже неправильное время. Таким образом, единственным решением является установка даты на сервере. Использование метода для каждой вставки/обновления не является изящным решением.


Общей практикой является изменение документа внутри обратного вызова allow или deny:


Messages.allow({
insert: function(userId, doc) {
...
doc.timestamp = new Date();
return true;
},
});

Таким образом, вы гарантируете, что все документы имеют совместимую метку времени, и вы можете использовать обычные методы db на клиенте.

ответил(а) 2014-06-04T22:26:00+04:00 6 лет, 1 месяц назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема