Laravel中Carbon添加小时异常:为何时间计算不符预期?
问题原因及解决方案
核心问题1:Carbon实例可变性导致时间重复累加
Laravel的now()返回Carbon实例,Carbon对象是可变的,调用addHours()这类方法时会直接修改原对象的时间,而非返回新实例。你的代码逻辑存在以下问题:
- 生成
end_date时,$date->addHours(3)已将原$date的时间往后推了3小时 - 生成
end_time时再次调用$date->addHours(3),相当于在已加3小时的基础上再加3小时,总共累加了6小时,导致结束时间超出预期。
核心问题2:日期格式字符串错误导致分钟显示异常
你使用的格式'HH[H]hh'中,hh代表12小时制的小时数,并非分钟。正确表示分钟的格式是mm,这一错误导致你看到的03实际是12小时制的小时值,而非原时间的分钟09。
修复后的代码
$date = now()->locale('es_ES'); // 使用copy()创建原对象副本,避免修改原实例 $start_date = $date->isoFormat('D [de] MMMM [de] YYYY'); $start_time = $date->isoFormat('HH[H]mm'); // 将hh替换为mm表示分钟 // 基于原$date对象添加3小时,复用同一副本避免重复累加 $endDate = $date->copy()->addHours(3); $end_date = $endDate->isoFormat('D [de] MMMM [de] YYYY'); $end_time = $endDate->isoFormat('HH[H]mm');
修复后输出
start_date : 24 de abril de 2023 start_time : 21H09 end_date : 25 de abril de 2023 end_time: 00H09
内容的提问来源于stack exchange,提问作者DeveloperX
相关产品推荐
相关产品推荐

