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

Carbon对象diffInMonths计算11月1日与12月1日返回0而非1的问题

问题描述

我有两个Carbon对象:

//$startDate
Carbon\Carbon @1667250000 {#3093 ▼
  date: 2022-11-01 00:00:00.0 Africa/Nairobi (+03:00)
}

和

//$endDate
Carbon\Carbon @1669842000 {#2920 ▼
  date: 2022-12-01 00:00:00.0 Africa/Nairobi (+03:00)
}

调用diffInMonths()方法时返回结果为0,预期应该是1:

$startDate->diffInMonths($endDate); //0

尝试给对象添加floorMonth()处理后结果还是一样。调用$startDate->diff($endDate)得到的结果显示天数差为30:

DateInterval {#3102 ▼
  interval: + 30d
  +"y": 0
  +"m": 0
  +"d": 30
  +"h": 0
  +"i": 0
  +"s": 0
  +"f": 0.0
}

请问哪里操作出错了?

问题分析与解决

这是因为Carbon的diffInMonths()默认严格按完整月份差计算——只有当两个日期之间的间隔达到或超过对应月份的准确天数时,才会返回1。

2022年11月有30天,11月1日到12月1日刚好是30天,但Carbon会判定这个间隔不满一个"完整月份周期"。

解决方法有两种:

  • 调用diffInMonths()时传入第三个参数$strict=false,关闭严格校验,此时会按月份数字的差值计算:
    $startDate->diffInMonths($endDate, false, false); // 返回1
    
  • 简化写法:直接传递false作为第二个参数(当第二个参数为false时,第三个参数默认也是false):
    $startDate->diffInMonths($endDate, false); // 返回1
    

关闭严格模式后,Carbon会基于月份数字的变化(12月-11月=1)计算差值,而不是检查实际间隔天数是否达到当月的完整天数。

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 01:50:25