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

PHP 獲取本週週一日期的高效函式(含快取機制)

     編輯:PHP 綜合知識

報表統計、週曆顯示、定時任務常需「本週週一 00:00:00」時間戳。本文提供 mondayTime() 函式:支援指定基準時間、可選回傳時間戳或格式化字串、內建靜態快取避免重複計算。

函式實作

function mondayTime($timestamp = 0, $returnTimestamp = true) {
    static $cache = [];
    $key = $timestamp . '|' . (int)$returnTimestamp;
    if (isset($cache[$key])) return $cache[$key];

    if (!$timestamp) $timestamp = time();
    // date('w'):0=週日, 1=週一...6=週六
    $w = (int)date('w', $timestamp);
    // 週一 = 當前時間 - (w-1) 天;若今天是週日(w=0),視為上週一(-6天)
    $offsetDays = $w > 0 ? $w - 1 : 6;
    $mondayTimestamp = strtotime("-$offsetDays days 00:00:00", $timestamp);

    $result = $returnTimestamp ? $mondayTimestamp : date('Y-m-d', $mondayTimestamp);
    $cache[$key] = $result;
    return $result;
}

使用範例

echo "本週週一時間戳: " . mondayTime() . "\n";
echo "本週週一日期: " . mondayTime(time(), false) . "\n";
echo "下週週一日期: " . mondayTime(strtotime('+1 week'), false) . "\n";
echo "指定日期所在週一: " . mondayTime(strtotime('2024-12-25'), false) . "\n"; // 2024-12-23

邏輯解析

快取機制效益

  • 同一請求中多次呼叫(如迴圈、多處模板)僅計算一次。
  • 靜態變數生命週期 = 當前請求,無記憶體洩漏風險。
  • 鍵值包含參數,不同基準時間/回傳格式獨立快取。

替代方案:DateTime 物件風格

function mondayDateTime($ts = 'now') {
    $dt = new DateTime('@' . (is_numeric($ts) ? $ts : strtotime($ts)));
    $dt->modify('monday this week'); // 相對日期字串
    $dt->setTime(0, 0, 0);
    return $dt; // 可直接 ->format('Y-m-d') 或 ->getTimestamp()
}
  • ✅ 可讀性極高,支援複雜相對日期('last monday', 'next monday')。
  • ⚠️ 物件建立開銷略大於時間戳運算,高頻呼叫建議用時間戳版。

兩種風格任選其一,統一專案代碼風格即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
今天 date('w')週一偏移天數說明
1 (週一)0今天就是週一
2 (週二)1往前 1 天
3 (週三)2往前 2 天
4 (週四)3往前 3 天
5 (週五)4往前 4 天
6 (週六)5往前 5 天
0 (週日)6往前 6 天(屬於上週)