laravel + carbon 实现,周、月、季度起始和截止时间

434 阅读1分钟

我们经常会遇到某项工作需要以一个固定的频率重复,比如:周、月、季度。

季度

$one = [];
$year = Carbon::now()->format('Y');  
$plan_start = Carbon::parse("{$year}-1-1 08:00:00");  
$plan_end = Carbon::parse("{$year}-3-1 18:00:00");
$season = ['一', '二', '三', '四'];  

for ($i = 0; $i < 4; $i++) {  
    $one['work_name'] = "{$year}{$season[$i]}季度";  
    $one['plan_start_at'] = $plan_start->format('Y-m-d 08:00:00');  
    $one['plan_finish_at'] = $plan_end->endOfMonth()->format('Y-m-d 18:00:00');  
    
    WorkTask::create($one);
    
    $plan_start->addMonths(3);  
    $plan_end->subDay()->addMonths(3);  
}

月度

$one = [];
$year = Carbon::now()->format('Y');  
$plan_start = Carbon::parse("{$year}-1-1 08:00:00");  
$plan_end = Carbon::parse("{$year}-1-1 18:00:00");

for ($i = 1; $i <= 12; $i++) {  
    $one['work_name'] = "{$year}{$i}月";  
    $one['plan_start_at'] = $plan_start->format('Y-m-d 08:00:00');  
    $one['plan_finish_at'] = $plan_end->endOfMonth()->format('Y-m-d 18:00:00');  
    
    WorkTask::create($one);

    $plan_start->addMonth();  
    $plan_end->subDays(3)->addMonth();
}

$now = Carbon::now();  
$sum = $now->isoWeeksInYear();

for ($i = 1; $i <= $sum; $i++) {  
    $one['work_name'] = "{$year}年第{$i}周";  
    $now->setISODate($year, $i);  
    
    $one['plan_start_at'] = $now->startOfWeek()->format('Y-m-d 08:00:00');  
    $one['plan_finish_at'] = $now->endOfWeek()->format('Y-m-d 18:00:00');  

    WorkTask::create($one);  
}