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
參數特性:
mktime(12, 0, 0) → 今日 12:00:00
mktime(0, 0, 0, 13, 1, 2023) → 2024-01-01is_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:00 | mktime(0, 0, 0, date('m'), 1, date('Y')) |
| 本月最後一天 23:59:59 | mktime(23, 59, 59, date('m')+1, 0, date('Y')) |
| 週一 00:00 | strtotime('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() | 效能最好、參數明確、無字串解析 | 需自行組裝參數 | 高效能、固定格式日期運算 |
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(); // 相同時間戳
?>