Laravel 12:UTC时区服务器配置定时任务于英国时间07:00执行
Laravel 12 定时任务适配伦敦时区(含夏令时)解决方案
一、正确的定时任务配置
将时区配置放在dailyAt()之前,确保Laravel先解析时区规则再处理执行时间:
$schedule->command('sign:scheduled-prescriptions') ->timezone('Europe/London') ->dailyAt('07:00');
此配置会自动将伦敦时间07:00转换为服务器UTC时间执行,且自动适配夏令时(Europe/London时区会自动处理GMT/BST的切换逻辑)。
二、排查任务未执行的核心原因
- 验证服务器Crontab配置:必须确保服务器Crontab每分钟运行Laravel调度器,这是定时任务触发的基础:
* * * * * cd /你的项目根目录 && php artisan schedule:run >> /dev/null 2>&1 - 查看Laravel日志:检查
storage/logs/laravel.log是否存在时区加载报错(需确保服务器已安装PHP intl扩展,且系统时区数据库完整)。 - 临时测试调度逻辑:替换
dailyAt('07:00')为everyMinute(),验证带时区的定时任务是否能正常触发,快速排除配置语法问题。
三、命令类的时区修正
原命令中Carbon::now()使用Laravel默认UTC时区,若需查询伦敦时区的当日处方,需修改$today的获取逻辑:
// 替换原$today赋值为伦敦时区的当日日期 $today = Carbon::now('Europe/London')->toDateString();
否则夏令时期间,伦敦时间07:00对应UTC06:00,此时UTC日期仍为前一天,会导致查询不到目标数据。
四、额外注意事项
- 保持
config/app.php中的timezone为UTC,无需修改。 - 若服务器时区数据库缺失,可通过
dpkg-reconfigure tzdata(Linux系统)更新时区数据。
内容的提问来源于stack exchange,提问作者Ashwini Singh
相关产品推荐
相关产品推荐

