You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 17:03:33