将客户端日期作为UTC日期对象保存到Mongo中

时间:2014-06-04 15:30:12

标签: mongodb meteor

我正在尝试将日期保存到meteor mongodb我的挑战如下: 1)如果我使用新的Date()它在mongo DB中创建一个日期对象,但是它将时间保存为本地时间javascript Date()这总是带有时区+ 0x:小时,基于浏览器本地时区。当我检索到它时会导致混乱,因为我假设我的数据库中的所有内容都是UTC。

2)我想使用时刻js库这很棒,因为它可以正确地表示UTC中的日期但我的挑战是如何让mongo db接受片刻时间?我使用moment.format()它将它保存为字符串!

那么如何使用UTC格式的日期对象向mongodb insert命令发送日期?字符串只是不工作:(

任何帮助都将不胜感激。

由于

3 个答案:

答案 0 :(得分:4)

我认为您需要了解有关这两个问题的所有信息herehere

TLDR:

  • 如果直接从客户端插入/更新,您将根据用户的时钟存储时间戳。它仍将以UTC格式存储,但您可能想也可能不想相信时间是正确的。我强烈建议对涉及时间的任何数据库修改使用一种方法,以便始终使用服务器的时间版本。

  • Moment对象不能序列化为与mongodb兼容的格式。使用日期对象并在客户端上对其进行格式化。

答案 1 :(得分:0)

在客户端上保存日期的问题是每个客户端可能有不同的时区,甚至错误的时间设置。因此,唯一的解决方案是在服务器上设置日期。为每次插入/更新使用方法不是一个优雅的解决方案。

通常的做法是修改allowdeny回调中的文档:

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

这样可以确保所有文档都具有兼容的时间戳,并且您可以在客户端上使用常用的db方法。

答案 2 :(得分:0)

Meteor社区最近发布了一份关于如何使用日期和时间的大量文档。除了David Weldon的链接之外,您还可以在那里找到很多有用的信息:

  

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

但是,我特别建议在不担心安全问题时使用https://github.com/mizzao/meteor-timesync。它允许您在客户端本地获取准确的服务器时间,即使客户端的时钟已关闭,而无需往返服务器。这可以用于各种原因 - 在我的应用程序中,我通常只使用服务器相对时间而不关心客户端的时间是什么。