目錄
在 PHP 中計算不重複的日期區間加總
建立於 11/3/2024 • 更新於 11/3/2024
有一組不固定長度的 array,裡面包含了工作經歷的起訖日期,例如:
$workExps = [
['startDate' => '2020/01', 'endDate' => '2023/02'], ['startDate' => '2024/06', 'endDate' => '2024/07'],
];
// or
$workExps = [
['startDate' => '2020/01', 'endDate' => '2022/08'], ['startDate' => '2021/05', 'endDate' => '2023/05'],
['startDate' => '2020/01', 'endDate' => '2022/08'], ['startDate' => '2021/05', 'endDate' => '2023/05'],
];
需要去計算工作日期的區間總合,且不能計算重複的日期,回傳一個 array 包含計算後的年和月。
範例
$totalMonths = 0;
$periods = [];
foreach ($workExps as $workExp) {
$start = Carbon::createFromFormat('Y/m', $workExp['startDate'])->startOfMonth();
$end = Carbon::createFromFormat('Y/m', $workExp['endDate'])->startOfMonth();
$newPeriod = CarbonPeriod::create($start, $end);
$overlap = false;
foreach ($periods as $index => $period) {
if ($newPeriod->overlaps($period)) {
$periods[$index] = CarbonPeriod::create(
min($period->getStartDate(), $newPeriod->getStartDate()),
max($period->getEndDate(), $newPeriod->getEndDate())
);
$overlap = true;
break;
}
}
if (!$overlap) {
$periods[] = $newPeriod;
}
}
foreach ($periods as $period) {
$start = $period->getStartDate();
$end = $period->getEndDate();
$totalMonths += $start->diffInMonths($end);
}
$resumeData['seniority'] = [(int) floor($totalMonths / 12), $totalMonths % 12];
Chris Wang
Keep Learning, and Keep Coding.
草木園丁兼全端工程師 • 期許自己每天多懂一點新知識 • 莫欺少年窮