如何将字符串解析为日期类型“1998/10/01”,“1998/1/01”格式YYYY / M / D.

时间:2015-04-24 15:23:38

标签: mongodb

我怎样才能将字符串解析为日期类型“1998/10/01”,“1998/1/01”格式YYYY / M / D,

棘手的部分是月份,这个字段可能是2位数,10~12位或1位数,1~9位。

是否可以在mongo中解析日期字符串的类型?

喜欢Date("$date_str")

3 个答案:

答案 0 :(得分:2)

是的,使用Javascript。

假设我有以下文件

{
    "_id" : ObjectId("553a6abb3614af9afd23310c"),
    "foo" : "bar",
    "date" : "1998/10/01"
}

请注意date是一个字符串。我们可以在Mongo Shell中运行以下JavaScript来更新它以成为日期对象。

db.test.find().forEach( function(doc) {
   if( typeof doc.date != 'undefined' ) { //There is a date property 
       var doc_date = doc.date.split("/"); //Explode on the `/`
       doc.date = new Date(doc_date[0], doc_date[1], doc_date[2]); //Overwrite current value with Date Object
       db.test.save(doc); //Save this document
   }
});

我们的文档现在将具有Date对象;

{
    "_id" : ObjectId("553a6abb3614af9afd23310c"),
    "foo" : "bar",
    "date" : ISODate("1998-11-01T00:00:00.000Z")
}

答案 1 :(得分:1)

从这样的日期字符串格式YYYY/M/D中获取日期对象非常容易;只需将字符串作为参数传递给创建时的Date对象。这两个简单的测试证实了这一点:

var d1 = new Date("1998/10/01"),
    d2 = new Date("1998/1/01");

console.log(d1); // Thu Oct 01 1998 00:00:00 GMT+0100 (GMT Daylight Time)
console.log(d2); // Thu Jan 01 1998 00:00:00 GMT+0000 (GMT Standard Time)

对于相对较小的数据集,您可以使用mongo的forEach()光标方法与$set运算符进行原子更新:

db.collection.find().forEach(function(doc) {
    db.collection.update(
        {"_id": doc._id}, 
        { 
            "$set": {
                "date": new Date(doc.date) 
             } 
        }
    );
});

答案 2 :(得分:0)

感谢您的回答。

我们应该{月} minus 1来获得正确的日期。

db[collection].find().forEach( function(doc) {
   if( typeof doc._id != 'undefined' ) { //There is a date property 
       var doc_date = doc._id.split("/"); //Explode on the `/`
       doc.date = new Date(doc_date[0], doc_date[1]-1, doc_date[2]); //Overwrite current value with Date Object
       doc.date = new Date(doc._id); //Overwrite current value with Date Object
       db[collection].save(doc); //Save this document
   }
});