PHP判断日期是否为周末应先校验输入合法性并设置时区,再用date('N')获取1-7的星期值(6=周六,7=周日)判断,避免直接使用strtotime()返回false导致的静默错误和时区偏差。

PHP 判断一个日期变量是否为周末,核心是用 date('w') 或 date('N') 获取星期几的数字值,再比对是否为周六(6)或周日(0 或 7)——注意时区和输入格式合法性,否则结果不可靠。
用 date('w') 判断:0=周日,6=周六
这是最常用的方式,date('w') 返回 0–6 的整数,其中 0 表示周日,6 表示周六。需确保传入的是有效时间戳或已用 strtotime() 转换过的字符串。
常见错误现象:date('w', '2024-06-15') 直接报错,因为第二个参数必须是整型时间戳,不能是字符串。
- 先用
strtotime($dateString)转成时间戳,失败时返回false,务必检查 - 示例:
$date = '2024-06-15'; // 周六 $ts = strtotime($date); if ($ts === false) { /* 处理非法日期 */ } $isWeekend = (date('w', $ts) === 0 || date('w', $ts) === 6); // true - 注意:
date()受date_default_timezone_set()影响,未设置时可能用系统默认时区,导致周五/周六边界偏移
用 date('N') 更符合 ISO 标准:1=周一,7=周日
date('N') 返回 1–7,更贴近日常“周一到周日”的直觉,周日是 7,周六是 6,判断逻辑更清晰,且避免了“0 是周日”带来的混淆。
立即学习“PHP免费学习笔记(深入)”;
- 同样依赖有效时间戳,
strtotime()失败要兜底 - 示例:
$ts = strtotime('2024-06-16'); // 周日 → 'N' = 7 $isWeekend = (date('N', $ts) >= 6); // 6 或 7 即为周末 - 兼容性:PHP 5.1.0+ 支持,老项目需确认版本
- 性能差异可忽略,但语义更明确,推荐新代码优先用
'N'
封装成函数时,必须处理输入容错和时区
直接裸用 date('w') 在真实业务中容易出问题,比如用户传入 '2024-02-30' 或空字符串,strtotime() 返回 false,后续 date() 会静默转成当前时间,结果完全错误。
- 强制校验日期有效性:用
checkdate()拆解年月日,或用DateTime::createFromFormat()并检查getLastErrors() - 显式设置时区,例如
date_default_timezone_set('Asia/Shanghai'),避免服务器配置干扰 - 不建议依赖全局时区,可在函数内用
new DateTime($date, new DateTimeZone('Asia/Shanghai'))确保可控 - 简单健壮写法示例:
function isWeekend($dateStr) { $dt = DateTime::createFromFormat('Y-m-d', $dateStr); if (!$dt || $dt->format('Y-m-d') !== $dateStr) return false; return in_array((int)$dt->format('N'), [6, 7]); }
真正容易被忽略的不是怎么写判断逻辑,而是日期字符串来源不可控时,没做格式校验 + 时区漂移 + strtotime() 静默容错这三者叠加,会让周末判断在某些日期上稳定出错,比如跨月最后一天或闰年2月。别省那几行校验代码。











