如何在MongoDB中正确解析佛历并转换为公历?
佛历转公历:处理闰年2月29日报错的解决方案
你的问题核心是:佛历的2月29日(如29/2/2567)转公历时,若对应公历年份不是闰年,直接用$dateSubtract会因无效日期报错。以下是几种针对性解决方法:
方案1:将佛历2月29日转为公历3月1日
通过字符串判断替换日期,避免生成无效日期:
{ $dateSubtract: { startDate: { $dateFromString: { dateString: { $cond: [ { $eq: [{ $substr: ["$receive_date", 0, 5] }, "29/2/"] }, { $concat: ["1/3/", { $substr: ["$receive_date", 5, 4] }, " ", { $substr: ["$receive_date", 10, 5] }] }, "$receive_date" ] }, format: "%d/%m/%Y %H:%M" } }, unit: "year", amount: 543 } }
方案2:将佛历2月29日转为公历2月28日
若希望保留同月,可替换为当月最后一个有效日期:
{ $dateSubtract: { startDate: { $dateFromString: { dateString: { $cond: [ { $eq: [{ $substr: ["$receive_date", 0, 5] }, "29/2/"] }, { $concat: ["28/2/", { $substr: ["$receive_date", 5, 4] }, " ", { $substr: ["$receive_date", 10, 5] }] }, "$receive_date" ] }, format: "%d/%m/%Y %H:%M" } }, unit: "year", amount: 543 } }
方案3:动态判断公历年份是否为闰年,自动调整日期
这个方案更精准,仅在目标公历年份非闰年时调整日期,遵循公历闰年规则:
{ $let: { vars: { gregorianYear: { $subtract: [{ $toInt: { $substr: ["$receive_date", 5, 4] } }, 543] } }, in: { $dateFromString: { dateString: { $cond: [ { $and: [ { $eq: [{ $substr: ["$receive_date", 0, 2] }, "29"] }, { $eq: [{ $substr: ["$receive_date", 3, 2] }, "2"] }, { $not: { $or: [ { $eq: [{ $mod: ["$$gregorianYear", 400] }, 0] }, { $and: [ { $eq: [{ $mod: ["$$gregorianYear", 4] }, 0] }, { $ne: [{ $mod: ["$$gregorianYear", 100] }, 0] } ]} ]} } ] }, { $concat: ["28/2/", { $toString: "$$gregorianYear" }, " ", { $substr: ["$receive_date", 10, 5] }] }, { $concat: [{ $substr: ["$receive_date", 0, 10] }, " ", { $substr: ["$receive_date", 10, 5] }] } ] }, format: "%d/%m/%Y %H:%M" } } } }
说明
- 方案1、2是简单直接的替换逻辑,适合对日期精度要求不高的场景;
- 方案3严格按照公历闰年规则判断,仅在必要时调整日期,精度更高;
- 所有方案均基于MongoDB聚合管道操作符,无需在应用层额外处理。
内容的提问来源于stack exchange,提问作者Imtk
相关产品推荐
相关产品推荐

