我使用的是Laravel 5.8,我喜欢自动生成发票。发票应在周一至周日自动生成。每周日晚上23:59:00
假设我有
"23:59:00根据地区时区"。
每个商店都与一个地区有关,从地区表中可以找到时区。
问题我应该如何设置CRON JOB,以便根据我将从表中获得的时区列表自动生成发票?。
我有两个建议;
如果希望它是静态的,请在数据库中用相应的时区定义每个命令。不同的时区可能具有相同的时间,例如Europe/Amsterdam
和Europe/Berlin
$schedule->command('generate:report')->timezone('one-of-the-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('another-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('yet-another-timezone')->at('23:59');
$schedule->command('generate:report')->timezone('some-other-timezone')->at('23:59');
如果你希望它是动态的,让它每59次运行一次。min,并尝试使用hour
将其与时区相匹配。
$schedule->command('generate:report')->hourlyAt(59);
在您的命令类中;
public function handle(TimezoneRepository $timezoneRepository)
{
$timezones = $timezoneRepository->getUniqueTimezones(); // the unique timezones in your database - cache if you want
foreach ($timezones as $timezone) {
$date = Carbon::now($timezone); // Carbon::now('Europe/Moscow'), Carbon::now('Europe/Amsterdam') etc..
if ($date->hour === 23) { // you are in that timezone
$currentTimezone = $date->getTimezone();
dispatch(new ReportMaker($currentTimezone)); // dispatch your report maker job
}
}
}
对于动态的,您将在一次迭代中(当执行generate:report
时(命中多个时区,正如我在开始时所说的那样。
其中一个可能的缺陷可能是;如果获取时区等的执行时间超过1分钟,您可能在00:00而不是23:59。最好异步计算报表并缓存时区列表,以免在执行此循环时遇到问题。
另一个可能的缺陷;
根据维基;
一些区域偏移了30或45分钟(例如,纽芬兰标准时间为UTC−03:30,尼泊尔标准时间为UTC+05:45,印度标准时间为UTC+05:30,缅甸标准时间为usc+06:30(。
如果你想涵盖其中的任何一个,那么最好执行像这样的命令
$schedule->command('generate:report')->cron('14,29,44,59 * * * *');
并进行小时和分钟的比较,例如;
$date->hour === 23 && $date->hour === 59
您可以在任务Schedulelding 中使用timezone((方法
使用时区方法,您可以指定计划任务时间应该在给定的时区内解释:
$schedule->command('report:generate') ->timezone('America/New_York') ->at('02:00')