$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") }
📌 注意事项
- ISO 模式用 isoWeekYear、isoWeek、isoDayOfWeek,不能与 year/month/day 混用
- 字段超出合法范围会报错,如 month 填 13,传值前应先校验
- timezone 影响结果日期,缺省为 UTC
🏷️ 相关标签
💡 相关案例
更多实战案例即将上线,敬请期待。
📚 相关教程
❓ 常见问题
Q能只传年就构造日期吗?
A可以,其余字段取默认值:month 为 1、day 为 1、时分秒毫秒为 0。
Q两套字段能混用吗?
A不能,year/month/day 与 isoWeekYear/isoWeek/isoDayOfWeek 互斥,混用会报错。
Q字段超界会报错吗?
A会,例如 month 填 13 或 day 填 32 会抛异常,传值前应做校验。