Carbon 正确安装命令是 composer require nesbot/carbon;v3 要求 PHP 8.1+,v2 兼容 PHP 7.4–8.0;v3 使用完整命名空间 Carbon\Carbon,需 use 声明或全限定名;中文本地化需单独引入 symfony/translation 并显式传 locale 参数。

Carbon 不是独立安装的库,它必须通过 Composer 引入,且需注意 PHP 版本和 Laravel 环境的隐含依赖。
composer require carbonphp/carbon 会失败
这是最常踩的坑:Carbon 官方包名不是 carbonphp/carbon,也不是 nesbot/carbon(旧版已归档),而是 nesbot/carbon 仍可安装,但自 v3 起官方推荐使用 carbonphp/carbon —— 实际上这个命名并不存在,carbonphp/carbon 是错误包名,会导致 Package carbonphp/carbon not found 错误。
正确命令是:
composer require nesbot/carbon
目前(2024 年)最新稳定版为 v3.x,支持 PHP 8.1+;若项目用 PHP 7.4–8.0,应显式指定 v2:
立即学习“PHP免费学习笔记(深入)”;
-
composer require nesbot/carbon:^2.72(v2 最后一个维护版本) - v2 默认不启用严格类型,v3 启用 strict typing,部分方法返回值类型更明确(如
diffInDays()总返回int) - Laravel 10+ 自带 Carbon v2.72+,Laravel 11 默认集成 Carbon v3,重复
require可能引发版本冲突
require 后无法 new Carbon() 或提示 Class not found
常见于未启用自动加载或命名空间误用。Carbon v3 默认使用完整命名空间 Carbon\Carbon,不再支持全局 Carbon 类名(v2 兼容层已移除)。
正确用法:
- PHP 文件顶部加
use Carbon\Carbon;,然后new Carbon() - 或直接写完整类名:
new \Carbon\Carbon() - 若用 Laravel,Facade
Carbon仍可用(Carbon::now()),但本质是Illuminate\Support\Facades\Carbon,非原生类 - 检查
vendor/autoload.php是否被正确引入 —— 没有这行,Composer 加载的所有类都不可见
时区/语言本地化不生效
Carbon 默认使用系统时区(date_default_timezone_get()),中文翻译需额外加载语言包,且 v3 中 setLocale() 不再自动切换翻译,必须配合 transChoice() 或 diffForHumans() 的 locale 参数。
实操要点:
- 设时区:
Carbon::setTestNow(Carbon::now('Asia/Shanghai'))或实例化时传参new Carbon('now', 'Asia/Shanghai') - 中文本地化:先
composer require symfony/translation(v3 需要),再执行Carbon::setLocale('zh');,最后调用$carbon->diffForHumans()才显示「2小时前」 - v2 中
Carbon::setLocale('zh')后所有实例自动汉化;v3 必须每次调用diffForHumans(['locale' => 'zh'])或全局设置Carbon::setLocale('zh')+ 使用支持 locale 的方法
Carbon v3 的命名空间、类型约束和本地化机制变化较大,升级前务必检查 diffForHumans()、createFromFormat() 和 startOfDay() 等高频方法的返回类型是否与原有逻辑兼容 —— 尤其当项目混用原生 DateTime 和 Carbon 实例时,类型断言容易失败。











