【问题标题】:Mongoose .find is giving me dates in the wrong formatMongoose .find 给我的日期格式错误
【发布时间】:2015-08-27 14:35:51
【问题描述】:

在 MongoDB 上,我有一个 Date 对象存储为:

"$date": "2015-08-27T13:50:49.000Z"

所以 MongoDB 上的日期是正确的。然后,我使用 Mongoose .find() 来获取该数据库中的“最新”消息,如下所示:

Message.find({}).sort({ "created_at" : -1 })
  .limit(1)
  .exec(function(error, result) {
    if(error) callback(error);
    var date = moment(result.created_at);
    console.log(date);
    console.log(result);
    callback(null, result);
});

所以当我将result 登录到控制台(即消息本身)时,它会向我显示时间:

created_at: Thu Aug 27 2015 21:50:49 GMT+0800 (CST)

时间是正确的,但是当它以 UTC 明确存储在 MongoDB 上时,我不想接收 GMT 日期。在此特定示例中,moment(result.created_at) 将日期打印到控制台,如下所示:

{ [Number: 1440685886247]
  _isAMomentObject: true,
  _isUTC: false,
  _locale: 
   { _ordinalParse: /\d{1,2}(th|st|nd|rd)/,
     ordinal: [Function],
     _abbr: 'en',
     _ordinalParseLenient: /\d{1,2}(th|st|nd|rd)|\d{1,2}/ },
  _d: Thu Aug 27 2015 22:31:26 GMT+0800 (CST) }

不知何故,这实际上是根据我的笔记本电脑打印当前时间。我不知道为什么当 date 使用 MongoDB 中的日期声明为 moment() 时会这样做。

那么有谁知道我如何成功地使用数据库中的日期?将消息打印到控制台时,我会在 GMT 中打印它,而在使用时刻时,我似乎正在打印笔记本电脑的时间。

谢谢!

更新:

到目前为止,我已经尝试从数据库中获取result.created_at 并使用以下方法将其输出到控制台:

var date = Date(result.created_at) // Prints current time on laptop
var date = new Date(result.created_at) // Prints undefined
var date = result.created_at // Prints undefined
var date = moment(result.created_at) // Prints moment object with the time as computer's time

我有点卡住了。我想将此日期对象用于另一个功能,但只能让它保持计算机的时间。

【问题讨论】:

  • 在console.log() 中,Date 对象只是字符串化。 Date 的默认 .toString() 方法会生成您看到的本地时间字符串。 “实际”日期对象通常是您期望的 UTC 值。因此,您的 moment 调用应该期待 JavaScript Date 对象,而不是您似乎正在做的“字符串”。
  • 有趣,您如何建议我从数据库中获取Date,并获取它的String 等效项以便我可以使用它?本质上,我需要它作为字符串,以便我可以使用它发出 API 请求。在记录moment(result.created_at) 时,它是否也显示当地时间?即使它是直接从.find() 传递的Date 对象。感谢您在过去几天对我的问题的回复,我绝对不是 Mongoose/MongoDB 上知识最渊博的人,我更像是一个设计/前端的人!
  • 您需要在这里了解更多信息。我已经给了你几次帮助,但要继续学习。你做事的方式不对。学习正确的方法。这是“不发送字符串”。对外部 API 使用“时间戳”,它们都知道如何处理任何语言的数据。
  • @BlakesSeven 我已经按照你说的做了,并尝试将created_at 保存为Date 或new Date(created_at) 或moment(created_at),当将它们打印到控制台时,它们仍然给我计算机的时间,当我在 API 中使用这些时间戳时,它们也会这样做。事实上,new Date(created_at) 实际上也将undefined 返回到控制台。
  • 对于find,result 参数是一个数组,即使您已将结果限制为 1 个文档。所以应该是result[0].created_at.toUTCString()。

标签: node.js mongodb date mongoose momentjs


【解决方案1】:

您在这里遇到的主要问题是,对于 find,回调的 result 参数是一个数组,即使您已将结果限制为 1 个文档。

所以要访问一个文档的 created_at 属性,它将是:

result[0].created_at

然后,要获取其包含的 UTC 日期和时间的字符串版本,请在其上调用 toUTCString():

result[0].created_at.toUTCString()

【讨论】:

  • 你知道为什么我可以在控制台中使用result.created_at吗?我实际上可以将它用作Date 对象,它仍会向控制台输出“日期”。我猜它实际上是在创建一个空的new Date,实际上它只是打印本地时间,因为变量无效或者是undefined。我的假设是我做错了什么,因为它显示了一个日期,只是错误的日期。
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2011-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多