報表統計、日誌查詢、定時任務常需「今日區間」、「昨日區間」、「明日區間」的精確時間戳。本文提供一個可複用函數,輸入「今日 00:00:00」時間戳,輸出三日區間陣列。
/**
* 取得昨日、今日、明日 的起始/結束時間戳
* @param int $todayStart 今日 00:00:00 時間戳
* @return array ['yesterday'=>[start,end], 'today'=>[start,end], 'tomorrow'=>[start,end]]
*/
function getThreeDayRanges(int $todayStart): array {
$oneDay = 86400; // 24*3600
$yesterdayStart = $todayStart - $oneDay;
$yesterdayEnd = $todayStart - 1;
$todayEnd = $todayStart + $oneDay - 1;
$tomorrowStart = $todayStart + $oneDay;
$tomorrowEnd = $tomorrowStart + $oneDay - 1;
return [
'yesterday' => [$yesterdayStart, $yesterdayEnd],
'today' => [$todayStart, $todayEnd],
'tomorrow' => [$tomorrowStart, $tomorrowEnd],
];
}
// 使用範例
$todayStart = strtotime(date('Y-m-d 00:00:00'));
$ranges = getThreeDayRanges($todayStart);
echo "昨日: " . date('Y-m-d H:i:s', $ranges['yesterday'][0]) . " ~ " . date('Y-m-d H:i:s', $ranges['yesterday'][1]) . "\n";
echo "今日: " . date('Y-m-d H:i:s', $ranges['today'][0]) . " ~ " . date('Y-m-d H:i:s', $ranges['today'][1]) . "\n";
echo "明日: " . date('Y-m-d H:i:s', $ranges['tomorrow'][0]) . " ~ " . date('Y-m-d H:i:s', $ranges['tomorrow'][1]) . "\n";
昨日: 2024-05-19 00:00:00 ~ 2024-05-19 23:59:59 今日: 2024-05-20 00:00:00 ~ 2024-05-20 23:59:59 明日: 2024-05-21 00:00:00 ~ 2024-05-21 23:59:59
function getDayRange(string $dateStr = 'today'): array {
$start = strtotime($dateStr . ' 00:00:00');
$end = strtotime($dateStr . ' 23:59:59');
return [$start, $end];
}
// 昨日
[$yStart, $yEnd] = getDayRange('yesterday');
// 明日
[$tStart, $tEnd] = getDayRange('tomorrow');
strtotime 依賴 PHP 預設時區。腳本開頭務必設定:
date_default_timezone_set('Asia/Shanghai'); // 或配置 php.ini date.timezone
否則在 UTC 環境下會產生偏移 8 小時的錯誤區間。
$range = getThreeDayRanges(strtotime(date('Y-m-d')));
$sql = "SELECT * FROM `orders`
WHERE `created_at` BETWEEN {$range['today'][0]} AND {$range['today'][1]}";
以「今日 00:00:00」為基準,加減 86400 秒即可精確推算三日區間。封裝為函數並統一時區設定,能避免跨時區、夏令時等隱性 Bug,是日期相關業務的基礎建設。