You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

询问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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 19:27:29