首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 獲取本周起止日期:strtotime 相對時間格式的一行代碼實現

     編輯:PHP 相關知識

一行代碼核心邏輯

<?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";
?>

邏輯詳解

  1. date('w') 返回 0(日)~6(六)。
  2. 若今天是周一($w=1):$w - $first = 0,減 0 天,即今天。若今天是周三($w=3):減 3-1=2 天,回到周一。
  3. 若今天是周日($w=0):三元運算 $w ? ... : 6 返回 6,減 6 天回到上周一。
  4. 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'
  • 前端周曆組件初始化範圍
  • 定時任務按周統計聚合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved