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
相关产品推荐
相关产品推荐

