聚合函数nodejs中$project中的格式日期

时间:2021-04-05 18:14:12

标签: node.js mongodb datetime mongodb-query aggregation-framework

我希望以 12 小时格式在聚合 $project 管道中格式化日期。

 $project: {
                  
                    UpdateDt:
                    { 
                     $dateToString: { format: "%m/%d/%Y ,%H:%M:%S", date: "$UpdateDt", timezone: "GMT" } 
                    },                  
            }
                

我尝试使用上面的代码,但这似乎不起作用,我还希望日期格式为: 2017 年 8 月 31 日,格林威治标准时间上午 10:30:00 使用上面的代码,我得到的输出为 09/14/2017,15:07:10 要求日期为 12 小时格式并附加 GMT,与使用 .toLocaleString() 函数实现的相同。

请提出任何相同的方法/解决方法。

3 个答案:

答案 0 :(得分:1)

演示 - https://mongoplayground.net/p/fIlimwXuOWK

在第一个管道中 - $addFields 添加一个新字段 UpdateNewDt,其中包含 {date, hour, time} 格林威治标准时间的详细信息。

第二个管道 - $set UpdateNewDt.hour 转换为 12 小时制并添加 AM 和 PM 例如:- 12 - 12 PM、02- 02 AM、23- 11 PM

第三条管道 - $set 将数据组合回字符串

第四管道 - $project - UpdateDt

db.collection.aggregate([
  {
    "$addFields": {
      UpdateNewDt: {
        date: { $dateToString: { format: "%m/%d/%Y ,", date: "$UpdateDt", timezone: "GMT" }},
        hour: { $dateToString: { format: "%H", date: "$UpdateDt", timezone: "GMT" }},
        time: { $dateToString: { format: ":%M:%S", date: "$UpdateDt", timezone: "GMT" }}
      }
    }
  },
  {
    $set: {
      "UpdateNewDt.hour": {
        $cond: {
          "if": { $gt: [ { "$toInt": "$UpdateNewDt.hour" }, 11 ] },
          "then": {
            "$concat": [
                {
                    $cond: [
                        { $eq: [{  "$toInt": "$UpdateNewDt.hour"},12 ] },
                        "12",
                        { $toString: {"$subtract": [ { "$toInt": "$UpdateNewDt.hour"  }, 12 ] }}
                    ] 
                },
                " PM" ] 
            },
          "else": { "$concat": [ "$UpdateNewDt.hour", " AM" ] }
        }
      }
    }
  },
  {
    $set: {
      "UpdateNewDt": {
        "$concat": [
          "$UpdateNewDt.date",
          { "$arrayElemAt": [{ "$split": [ "$UpdateNewDt.hour", " " ] }, 0 ] },
          "$UpdateNewDt.time",
          " ",
          { "$arrayElemAt": [{ "$split": [ "$UpdateNewDt.hour", " " ] }, 1 ] }
        ]
      }
    }
  },
   {
    $project: { UpdateDt: "$UpdateNewDt" }
  }
])

输入 -

[
  {
    "key": 1,
    UpdateDt: ISODate("2021-04-06T02:07:47.231Z")
  },
  {
    "key": 2,
    UpdateDt: ISODate("2021-04-06T22:07:47.231Z")
  },
  {
    "key": 3,
    UpdateDt: ISODate("2021-04-06T12:07:47.231Z")
  }
]

输出 -

[
  {
    "UpdateDt": "04/06/2021 ,02:07:47 AM",
    "_id": ObjectId("5a934e000102030405000000")
  },
  {
    "UpdateDt": "04/06/2021 ,10:07:47 PM",
    "_id": ObjectId("5a934e000102030405000001")
  },
  {
    "UpdateDt": "04/06/2021 ,12:07:47 PM",
    "_id": ObjectId("5a934e000102030405000002")
  }
]

答案 1 :(得分:0)

我认为不支持。

以下是 $dateToString 的官方文档:https://docs.mongodb.com/manual/reference/operator/aggregation/dateToString/

对于指定的可用格式,只有 24 小时制。

如果您不需要在聚合步骤中对其进行格式化,我建议您使用 date-fns 包。您只能导入 format 函数,并且可以按照您需要的格式设置日期格式。

这是包:https://www.npmjs.com/package/date-fns

这是文档:https://date-fns.org/v2.19.0/docs/format

答案 2 :(得分:0)

嗨,据我所知,您可以使用以下脚本

收藏 “用户”:[ { "_id": 3, "ts": ISODate("2016-06-18T18:30:00.288Z") } ]

查询

db.users.aggregate([
  {
    $project: {
      "date": {
        "$dateToString": {
          "format": "%m/%d/%Y ,%H:%M:%S",
          "date": "$ts",
          "timezone": "GMT"
        }
      }
    }
  }
])

输出

[
  {
    "_id": 3,
    "date": "06/18/2016 ,18:30:00"
  }
]