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

PHP mktime() 時間戳運算:區間判斷與日期計算實戰

     編輯:PHP 相關知識

mktime() 核心語法與參數詳解

mktime() 回傳 Unix 時間戳(自 1970-01-01 00:00:00 UTC 起的秒數),是 PHP 日期時間運算的基礎函數。

函數原型

mktime(
    int $hour = 0,
    int $minute = 0,
    int $second = 0,
    int $month = 1,
    int $day = 1,
    int $year = 1970
): int|false

參數特性:

  • 所有參數皆為可選,預設為當前 GMT 時間對應值
  • 參數可從右至左省略:mktime(12, 0, 0) → 今日 12:00:00
  • 參數會自動修正溢位:mktime(0, 0, 0, 13, 1, 2023) → 2024-01-01
  • is_dst 參數自 PHP 5.1.0 棄用,改用時區設定

常見時間區間判斷

<?php
// 取得今日 09:00 與 19:00 時間戳
$today9am = mktime(9, 0, 0);
$today7pm = mktime(19, 0, 0);

// 更簡潔寫法(參數省略)
$today9am = mktime(9, 0, 0, date('m'), date('d'), date('Y'));
$today7pm = mktime(19, 0, 0, date('m'), date('d'), date('Y'));

$now = time();

if ($now >= $today9am && $now <= $today7pm) {
    echo "營業時間內";
} else {
    echo "非營業時間";
}
?>

日期運算實戰技巧

需求實作方式
明天這個時間mktime(date('H'), date('i'), date('s'), date('m'), date('d')+1, date('Y'))
下月同一天mktime(0, 0, 0, date('m')+1, date('d'), date('Y'))
本月第一天 00:00mktime(0, 0, 0, date('m'), 1, date('Y'))
本月最後一天 23:59:59mktime(23, 59, 59, date('m')+1, 0, date('Y'))
週一 00:00strtotime('monday this week') 或 mktime(0,0,0, date('m'), date('d') - date('w') + 1, date('Y'))
指定日期判斷是否為週末in_array(date('w', $timestamp), [0, 6])

進階:營業時間判斷類別

<?php
class BusinessHours {
    private $timezone;
    private $schedule = [];  // [週幾 => ['open' => '09:00', 'close' => '18:00']]
    
    public function __construct(string $timezone = 'Asia/Taipei') {
        $this->timezone = new DateTimeZone($timezone);
    }
    
    public function setSchedule(array $schedule) {
        $this->schedule = $schedule;
    }
    
    public function isOpen(DateTime $time = null): bool {
        $time = $time ?? new DateTime('now', $this->timezone);
        $dayOfWeek = (int)$time->format('w');  // 0=週日, 1=週一...
        $currentMinutes = (int)$time->format('H') * 60 + (int)$time->format('i');
        
        if (!isset($this->schedule[$dayOfWeek])) {
            return false;  // 未設定排程 = 休息
        }
        
        $open = $this->parseTime($this->schedule[$dayOfWeek]['open']);
        $close = $this->parseTime($this->schedule[$dayOfWeek]['close']);
        
        // 跨午夜營業(如 22:00 - 04:00)
        if ($close < $open) {
            return $currentMinutes >= $open || $currentMinutes < $close;
        }
        
        return $currentMinutes >= $open && $currentMinutes < $close;
    }
    
    private function parseTime(string $time): int {
        [$h, $m] = explode(':', $time);
        return (int)$h * 60 + (int)$m;
    }
}

// 使用範例
$biz = new BusinessHours();
$biz->setSchedule([
    1 => ['open' => '09:00', 'close' => '18:00'],  // 週一
    2 => ['open' => '09:00', 'close' => '18:00'],
    3 => ['open' => '09:00', 'close' => '18:00'],
    4 => ['open' => '09:00', 'close' => '18:00'],
    5 => ['open' => '09:00', 'close' => '18:00'],
    6 => ['open' => '10:00', 'close' => '16:00'],  // 週六
    // 0 (週日) 未設定 = 休息
]);

var_dump($biz->isOpen());  // 當前是否營業
?>

mktime() vs strtotime() vs DateTime

函數/類別優點缺點適用場景
mktime()效能最好、參數明確、無字串解析需自行組裝參數高效能、固定格式日期運算
strtotime()自然語言支援強大效能較差、歧義性、時區陷阱快速原型、使用者輸入解析
DateTime物件導向、時區支援完整、不可變操作物件建立開銷複雜日期邏輯、企業級應用

時區陷阱與最佳實踐

<?php
// 必須設定預設時區(php.ini 或程式碼)
date_default_timezone_set('Asia/Taipei');

// mktime() 參數視為「本地時間」,回傳 UTC 時間戳
$local = mktime(12, 0, 0, 1, 1, 2024);  // 2024-01-01 12:00:00 Asia/Taipei
echo date('Y-m-d H:i:s', $local);        // 2024-01-01 12:00:00

// 等同於
$dt = new DateTime('2024-01-01 12:00:00', new DateTimeZone('Asia/Taipei'));
echo $dt->getTimestamp();                 // 相同時間戳
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved