一行代碼核心邏輯
<?php
// 假設周一為週起始 (ISO-8601 標準),$first=1 代表周一,0 代表周日
$first = 1;
$today = date('Y-m-d'); // 或指定日期
$w = date('w', strtotime($today)); // 0=周日, 1=周一...6=周六
// 本周開始日期 (周一)
$weekStart = date('Y-m-d', strtotime("$today -" . ($w ? $w - $first : 6) . " days"));
// 本周結束日期 (周日)
$weekEnd = date('Y-m-d', strtotime("$weekStart +6 days"));
echo "本周範圍: $weekStart 至 $weekEnd";
?>
邏輯詳解
date('w') 返回 0(日)~6(六)。
- 若今天是周一(
$w=1):$w - $first = 0,減 0 天,即今天。若今天是周三($w=3):減 3-1=2 天,回到周一。
- 若今天是周日(
$w=0):三元運算 $w ? ... : 6 返回 6,減 6 天回到上周一。
strtotime 解析相對格式 -N days、+6 days 極其可靠。
封裝為通用函數
<?php
/**
* 獲取指定日期所在週的起止日期
* @param string $date 日期字符串 (默認今天)
* @param int $weekStartDay 週起始日 1=周一(默認) 0=周日
* @return array ['start'=>'Y-m-d', 'end'=>'Y-m-d']
*/
function getWeekRange(string $date = '', int $weekStartDay = 1): array {
$date = $date ?: date('Y-m-d');
$w = (int)date('w', strtotime($date));
$diff = $w ? $w - $weekStartDay : (6 - $weekStartDay); // 周日特判
$start = date('Y-m-d', strtotime("$date -$diff days"));
$end = date('Y-m-d', strtotime("$start +6 days"));
return ['start' => $start, 'end' => $end];
}
// 使用
print_r(getWeekRange()); // 本周 (周一~周日)
print_r(getWeekRange('2024-12-25', 0)); // 指定日期,周日~周六
?>
現代化:DateTimeImmutable (PHP 5.5+)
<?php
function getWeekRangeModern(string $date = '', int $weekStartDay = 1): array {
$dt = $date ? new DateTimeImmutable($date) : new DateTimeImmutable();
// ISO-8601: 周一=1 ... 周日=7
$isoDay = (int)$dt->format('N');
$diff = $isoDay - $weekStartDay; // weekStartDay: 1=Mon, 7=Sun
if ($weekStartDay === 0) $diff = $isoDay % 7; // 周日為起始特殊處理
$start = $diff >= 0 ? $dt->modify("-$diff days") : $dt->modify("+".abs($diff)." days");
$end = $start->modify('+6 days');
return ['start' => $start->format('Y-m-d'), 'end' => $end->format('Y-m-d')];
}
?>
常見陷阱
- 時區:
date()/strtotime() 受 date_default_timezone_set 影響,跨時區應用請統一用 UTC 計算再轉換。
- 周日判斷:
w=0 是周日,N=7 是周日,邏輯易混淆,封裝函數時務必加單元測試覆蓋周日、周一邊界。
- 月份邊界:本周可能跨月 (如 1月31日~2月6日),
Y-m-d 格式天然支持,無需額外處理。
應用場景
- 周報表 SQL 查詢:
WHERE created_at BETWEEN '$weekStart' AND '$weekEnd 23:59:59'
- 前端周曆組件初始化範圍
- 定時任務按周統計聚合