Laravel 5.6中Carbon返回错误日期?二月日期异常问题
解决Carbon设置二月起始日却返回三月的异常问题
嘿,这个问题我之前也踩过坑!其实核心原因是Carbon的日期自动溢出机制在搞鬼,咱们来拆解一下:
问题根源
看你的代码,假设当前$now的日期是比如2018年3月31日(或者任何一个当月天数比2月多的日期),当你调用month(2)时,Carbon会尝试把日期设置为2月31日——但2018年2月只有28天,Carbon会自动把这个“不存在的日期”调整为3月3日(28+3=31)。这时候再调用startOfMonth(),自然就会得到3月1日了!其他月份没有这个问题,是因为除了2月,其他月份的天数要么和目标月一致,要么调整后不会跨月。
几种靠谱的解决方案
1. 调整调用顺序(最简单)
先把日期拉到当月月初,再设置月份,这样就不会有溢出问题:
$now = Carbon::now()->setTimezone('America/Costa_Rica'); $febmon = $now->copy()->startOfMonth()->month(2); dd($febmon);
2. 直接构造目标日期(最稳妥)
跳过依赖当前日期的操作,直接指定年、月、日来构造,结果完全可控:
$now = Carbon::now()->setTimezone('America/Costa_Rica'); $currentYear = $now->year; // 直接创建2月1日零时的Carbon实例 $febmon = Carbon::create($currentYear, 2, 1, 0, 0, 0, 'America/Costa_Rica'); dd($febmon);
3. 强制设置日期为1号
如果坚持要先设置月份,那在之后直接把日期设为1号,再回到当天起始点:
$now = Carbon::now()->setTimezone('America/Costa_Rica'); $febmon = $now->copy()->month(2)->day(1)->startOfDay(); dd($febmon);
验证结果
用上面任意一种方法,你都会得到预期的结果:
2018-02-01 00:00:00.0 America/Costa_Rica (-06:00)
内容的提问来源于stack exchange,提问作者NaturalDevCR
相关产品推荐
相关产品推荐

