【问题标题】:How do you convert date to moment你如何将日期转换为时刻
【发布时间】:2014-08-30 09:14:27
【问题描述】:

我正在尝试转换我存储在数据库(mongo)中的日期(时刻),然后与当前日期进行比较以获得差异。但是,当我从 db 检索过去的日期并使用当前时刻时,我不能使用 diff()。在数据库插入中,我插入了{startDate:moment(), ...}。然后,在我检索 startDate 日期后,我尝试获取差异

var now = moment();
console.log(now.diff(startDate))

但它会抛出一个error

我存储 moment 而不是 js date 对象,但我仍然收到错误,所以我不确定我应该如何实际获取存储值的差异并将其与当前时刻。

【问题讨论】:

    标签: mongodb momentjs


    【解决方案1】:

    如果您插入startDate:moment(),这将保存moment 对象的内容......而不是您可能期望的Date 字段。

    例如,在mongo shell 中:

    > db.mycollection.insert({startDate:moment()})
    WriteResult({ "nInserted" : 1 })
    
    > db.mycollection.findOne()
    {
        "_id" : ObjectId("5401a7805a5b0e4e0bfe5170"),
        "startDate" : {
            "_isAMomentObject" : true,
            "_i" : null,
            "_f" : null,
            "_l" : null,
            "_strict" : null,
            "_isUTC" : false,
            "_pf" : {
                "empty" : false,
                "unusedTokens" : [ ],
                "unusedInput" : [ ],
                "overflow" : -2,
                "charsLeftOver" : 0,
                "nullInput" : false,
                "invalidMonth" : null,
                "invalidFormat" : false,
                "userInvalidated" : false,
                "iso" : false
            },
            "_d" : ISODate("2014-08-30T10:29:20.529Z")
        }
    }
    

    startDate._d 字段中保存了一个适当的Date,但我认为您真正想要做的是使用new Date() 构造函数在startDate 字段中保存一个值:

    >  db.mycollection.insert({startDate:new Date()})
    WriteResult({ "nInserted" : 1 })
    
    > doc = db.mycollection.findOne()
    {
        "_id" : ObjectId("5401a8fe5a5b0e4e0bfe5173"),
        "startDate" : ISODate("2014-08-30T10:35:42.736Z")
    }
    

    现在您应该能够按预期执行日期数学:

    > var now = moment();
    
    // Diff in milliseconds (http://momentjs.com/docs/#/displaying/difference/)
    > now.diff(doc.startDate)
    6825
    

    【讨论】:

    • 您应该使用 moment 的 .toDate() 函数,而不是尝试从某个时刻构造一个日期。或者只是将片刻留在插入之外并在没有参数的情况下调用new Date()
    • 您是正确的,您不应该使用 _d 属性。它不是 moment 的公共 API 的一部分。
    • 为了搞清楚,我也尝试使用 var date = moment().format('MMMM Do YYYY, h:mm:ss a');然后将其存储到数据库中,但是当我使用 now = moment().format('MMMM Do YYYY, h:mm:ss a'); 进行比较时它不起作用.但是,存储 newDate(moment()) 和 moment().toDate() 确实有效。谢谢
    • @MattJohnson:同意,一个简单的new Date() 就可以了。我在想 moment() 调用可能还有其他选项(例如,如果使用时区或其他相对日期便利),但这不是一个很好的例子:)。
    【解决方案2】:

    您可以直接将 Date 对象传递给 moment.js 构造函数。

    var my_date = new Date()
    moment(my_date) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 2010-12-02
      相关资源
      最近更新 更多