$dateFromParts(由日期组成部分构造日期)

最后更新:2026-10-09

$dateFromParts(由日期组成部分构造日期)

$dateFromParts 用年、月、日、时、分、秒、毫秒等数值部件构造一个日期,是 $dateToParts 的逆操作。它有两种模式:按日历字段(year、month、day 等)构造,或按 ISO 8601 周历字段(isoWeekYear、isoWeek、isoDayOfWeek)构造。未指定的字段取最小值(month 缺省为 1、hour 缺省为 0)。常用于从拆分存储的日期字段重组日期,或构造统计区间边界。timezone 决定结果日期对应的时区,缺省为 UTC。

分类日期
MongoDB 版本1.0+
示例语言mongosh (Shell)

📝 语法

{ $dateFromParts: { year: <数值>, month: <数值>, day: <数值>, hour: <数值>, minute: <数值>, second: <数值>, millisecond: <数值>, timezone: <时区> } }

⚙️ 参数

year必填,年份(日历模式)或 isoWeekYear(ISO 模式)。
month / isoWeek月份(缺省 1)或 ISO 周数,两种模式取其一。
day / isoDayOfWeek日(缺省 1)或 ISO 星期几。
hour/minute/second/millisecond可选,时分秒毫秒,缺省为 0。
timezone可选,构造结果对应的时区。

返回值:构造出的 BSON Date;year 缺失时返回 null。

▶ 示例

请在本地安装的 mongosh 中执行以下命令(需已启动 mongod):

// $dateFromParts:用拆分字段构造事件时间(北京时间)
db.events.aggregate([
  { $project: {
      startedAt: { $dateFromParts: { year: '$y', month: '$m', day: '$d', timezone: 'Asia/Shanghai' } }
  } }
])

运行结果:

{ "_id": 1, "startedAt": ISODate("2026-09-25T00:00:00Z") }
{ "_id": 2, "startedAt": ISODate("2026-10-01T00:00:00Z") }

📌 注意事项

更多实战案例即将上线,敬请期待。

📚 相关教程

❓ 常见问题

Q能只传年就构造日期吗?
A可以,其余字段取默认值:month 为 1、day 为 1、时分秒毫秒为 0。
Q两套字段能混用吗?
A不能,year/month/day 与 isoWeekYear/isoWeek/isoDayOfWeek 互斥,混用会报错。
Q字段超界会报错吗?
A会,例如 month 填 13 或 day 填 32 会抛异常,传值前应做校验。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏