// 英文完整星期名
echo date('l'); // Thursday
// 數字 0(周日)-6(周六)
echo date('w'); // 4
// 中文星期
$week = ['日','一','二','三','四','五','六'];
echo "星期{$week[date('w')}"; // 星期四
// 指定日期
echo "星期{$week[date('w', strtotime('2011-11-11'))]}"; // 星期五
function getWeek($timestamp = null): string {
$ts = is_numeric($timestamp) ? $timestamp : time();
$week = ['日','一','二','三','四','五','六'];
return '星期' . $week[date('w', $ts)];
}
echo getWeek(); // 今天
echo getWeek(strtotime('2025-01-01')); // 指定日期
function getWeekSwitch(): string {
switch (date('w')) {
case 1: return '星期一';
case 2: return '星期二';
case 3: return '星期三';
case 4: return '星期四';
case 5: return '星期五';
case 6: return '星期六';
case 0: return '星期日';
}
}
date()/strtotime() 基於 Unix 時間戳(有符號 32 位整數),範圍約 1901-12-13 到 2038-01-19。超出範圍返回 false/錯誤。
$dt = new DateTime('2049-10-01'); // 建國100周年
echo $dt->format('l'); // Friday
echo $dt->format('w'); // 5
// 64 位 PHP 支持任意年份
// 32 位 PHP 仍受限,需升級或用蔡勒公式
function getWeekZeller(int $year, int $month, int $day): string {
if ($month < 3) { $month += 12; $year--; }
$c = (int)($year / 100);
$y = $year % 100;
$w = ($y + (int)($y/4) + (int)($c/4) - 2*$c + (int)(26*($month+1)/10) + $day - 1) % 7;
$week = ['日','一','二','三','四','五','六'];
return '星期' . $week[($w + 7) % 7];
}
// 驗證 2049-10-01
echo getWeekZeller(2049, 10, 1); // 星期五
// 驗證歷史日期
echo getWeekZeller(1949, 10, 1); // 星期六 (開國大典)
c:世紀數 - 1 (如 2049 年 c=20)y:年份後兩位 (49)m:月份 (3=3月...14=翌年2月),1月視作上年13月,2月視作14月d:日期w:0=周日, 1=周一...6=周六| 方法 | 耗時 | 適用範圍 |
|---|---|---|
| date('w') | ~0.12s | 1970-2038 (32位) |
| DateTime::format('w') | ~0.18s | 任意年份 (64位) |
| 蔡勒公式 | ~0.08s | 任意年份、純整數運算最快 |
date('w') + 中文映射數組,最簡潔高效DateTime 類,功能豐富、面向對象strtotime 解析中文日期,直接構造 DateTime 或用蔡勒公式