考勤、排班系統需依當前時間判斷「白班」或「夜班」。典型定義:
<?php
date_default_timezone_set('PRC'); // 設定中國時區
$hour = (int)date('H'); // 24 小時制 0-23
if ($hour >= 9 && $hour < 21) {
echo '白班';
} else {
echo '夜班';
}
?>
<input name="riqi" class="Wdate" type="text" id="riqi"
value="<?=date('Y-m-d')?>" />
搭配 My97DatePicker 等元件,讓使用者可查詢歷史日期班次。
| 維度 | PHP (伺服端) | JavaScript (客戶端) |
|---|---|---|
| 時間來源 | 伺服器系統時鐘 | 使用者電腦/裝置時鐘 |
| 可信度 | 高(受控環境) | 低(用戶可竄改) |
| 時區處理 | 統一設定 date_default_timezone_set() | 取決於瀏覽器/OS 設定 |
| 適用場景 | 考勤打卡、訂單時間、日誌記錄 | 倒數計時器、本地顯示優化 |
若伺服器位於海外(如美國),未正確設定時區會導致班次判斷錯誤。務必在程式入口或 php.ini 設定:
date_default_timezone_set('Asia/Shanghai'); // 或 'PRC'
或修改 php.ini:
date.timezone = "Asia/Shanghai"
function getShift($timestamp = null, $rules = []) {
$defaultRules = [
'day' => ['start' => 9, 'end' => 21],
'night' => ['start' => 21, 'end' => 9],
];
$rules = array_merge($defaultRules, $rules);
$hour = (int)date('H', $timestamp ?: time());
return ($hour >= $rules['day']['start'] && $hour < $rules['day']['end']) ? '白班' : '夜班';
}