询问2022-07-24T19:00:00.000Z格式及Laravel调度代码运行问题
问题解答
1. 日期格式说明
2022-07-24T19:00:00.000Z 属于 ISO 8601标准的UTC日期时间格式:
T是日期与时间的分隔符Z表示该时间为UTC零时区时间
2. 代码运行分析与优化建议
代码能否正常运行?
语法上可以正常执行,但逻辑不符合预期:
strtotime(env('LAUNCH_COUNTDOWN'))能正确解析ISO 8601格式字符串,得到2022-07-24 19:00:00 UTC对应的时间戳strtotime(date("Y-m-d"))得到的是当前日期00:00:00 UTC的时间戳- 此时
$currentDate >= $targetDate的条件,要等到2022-07-25 00:00:00 UTC之后才会成立,而非目标日期当天触发
是否需要修改?
根据不同需求,需要调整代码,以下是两种常见场景的优化方案:
方案一:仅比较日期部分(忽略时间)
如果需求是「当前日期(不含时间)≥目标日期的日期部分就执行」,可将目标时间转换为对应日期的00:00:00时间戳,再和当前日期的00:00:00时间戳比较:
$schedule->call(function () { BlastEmail::blastAll(); })->hourly()->when(function() { $targetTimestamp = strtotime(date('Y-m-d', strtotime(env('LAUNCH_COUNTDOWN')))); $currentTimestamp = strtotime(date("Y-m-d")); return $currentTimestamp >= $targetTimestamp; });
方案二:比较完整时间(当前时间超过目标时间即执行)
如果需求是「当前时间≥目标时间就执行」,直接用当前时间戳和目标时间戳对比即可,无需转换为日期格式:
$schedule->call(function () { BlastEmail::blastAll(); })->hourly()->when(function() { $targetTimestamp = strtotime(env('LAUNCH_COUNTDOWN')); $currentTimestamp = time(); return $currentTimestamp >= $targetTimestamp; });
额外注意
代码中ENV()建议改为Laravel规范的小写env(),PHP虽不区分函数名大小写,但框架标准写法为小写。
内容的提问来源于stack exchange,提问作者Christopher Nathanael Tessy
相关产品推荐
相关产品推荐

