Laravel 8中Asia/Tehran时区DST显示异常问题求助
解决Laravel 8中Carbon显示伊朗过时夏令时的问题
核心原因
伊朗取消夏令时的规则更新依赖PHP的时区数据库(tzdata),如果你的PHP环境使用旧版tzdata,Carbon会沿用过时的夏令时规则。
解决步骤
更新PHP时区数据库(tzdata)
- Linux系统(Debian/Ubuntu):
运行以下命令更新系统时区数据并重启PHP服务:sudo apt update && sudo apt install --only-upgrade tzdata sudo systemctl restart php8.0-fpm # 替换为你的PHP版本对应的服务名,比如php7.4-fpm - Windows系统:
要么将PHP升级到兼容Laravel 8的最新小版本(新版本内置更新的tzdata),要么手动下载官方最新tzdata文件,替换PHP安装目录下ext\date\tzdata文件夹中的内容。 - 通过Composer更新Carbon:
Carbon会同步时区规则,运行命令更新到兼容Laravel 8的最新版本:composer require nesbot/carbon:^2.62
- Linux系统(Debian/Ubuntu):
验证修复效果
打开Laravel Tinker执行以下命令,检查时区偏移是否正确(伊朗当前固定为UTC+03:30,无夏令时切换):php artisan tinker echo Carbon::now()->format('Y-m-d H:i:s T P');若输出包含
+03:30而非+04:30,说明规则已更新成功。备选应急方案:强制固定时区偏移
若上述方法无法立即生效,可在app/Providers/AppServiceProvider.php的boot方法中强制设置固定偏移(注意:此方法会忽略未来时区规则变更,仅作临时解决):use Carbon\Carbon; public function boot() { Carbon::macro('nowTehran', function () { return Carbon::now()->setTimezone('UTC')->addHours(3)->addMinutes(30); }); // 之后使用 Carbon::nowTehran() 替代 Carbon::now() }
内容的提问来源于stack exchange,提问作者Behzad
相关产品推荐
相关产品推荐

