最直接的方式是用 date('w') 返回0–6(0为周日,6为周六)判断是否为0或6,需先设置时区如 date_default_timezone_set('Asia/Shanghai'),并显式转整型 (int)date('w');推荐用 DateTime 类构造对象后 format('w') 判断,更可靠且易捕获异常。

用 date() 获取星期几再判断是否为周末
PHP 里最直接的方式是调用 date('w'),它返回数字 0–6(0 表示周日,6 表示周六),然后判断是否为 0 或 6。注意:这个函数依赖服务器本地时区,如果时区没设对,结果可能错。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 先确保时区已设置,比如
date_default_timezone_set('Asia/Shanghai');,否则在不同环境(如 Docker、共享主机)下结果不一致 -
date('w')返回的是字符串还是整数?实际返回字符串,但 PHP 会自动类型转换,不过显式转成整型更稳妥:(int) date('w') - 别用
date('D')(返回 'Mon'/'Sun')做判断——它依赖 locale,中文环境下可能返回 '星期一',不可靠
用 DateTime 类判断更可靠,尤其跨日期计算时
当你要判断某个特定日期(比如用户传来的 $date_str = '2024-06-15')是不是周末,DateTime 比 date() 更清晰、不易出错。
实操建议:
立即学习“PHP免费学习笔记(深入)”;
- 构造对象时捕获异常:
$dt = new DateTime($date_str);如果$date_str格式非法,会抛出Exception,必须 try/catch - 用
$dt->format('w')取星期数字,和上面逻辑一致;也可用$dt->format('N')(1=周一,7=周日),这时周末是 6 或 7,注意别混用 - 避免直接用
strtotime($date_str)+date('w', $ts)组合——strtotime对模糊格式(如 '06/15')解析有歧义,且不报错,容易埋坑
常见错误:把「周六日」写成「6 和 7」或漏掉周日
最容易踩的坑是记错 date('w') 的取值范围,写成 in_array(date('w'), [6, 7]) —— 7 永远不会出现,这会导致周日永远判为非周末。
另一个典型问题是只检查 6(周六),忘了 0(周日),尤其在快速复制粘贴别人代码时容易漏。
验证方式很简单:
- 手动测两个已知日期:
date('w', strtotime('2024-06-15'))→ 应该是 6(周六),date('w', strtotime('2024-06-16'))→ 应该是 0(周日) - 别依赖“今天是不是周末”来测试,因为今天可能不是周末,导致逻辑一直走不到分支里
需要兼容历史 PHP 版本?注意 DateTime 在 5.2+ 才完整支持
如果你维护的是老项目(PHP 5.1 或更早),DateTime 类部分方法不可用,此时只能用 date() + strtotime() 组合,但务必加容错:
- 对输入日期先用
strtotime()转时间戳,检查是否为false(失败返回 false,不是 -1) - 再用
date('w', $ts),并确认$ts !== false,否则会警告 “date() expects parameter 2 to be long” - PHP 5.1 不支持
DateTime::createFromFormat(),所以像 'Y-m-d H:i:s' 这种格式要靠strtotime解析,精度有限
真正麻烦的不是写几行判断逻辑,而是时区、输入校验、历史版本兼容这三块。哪怕只是内部小工具,也建议统一用 DateTime + 显式时区 + 异常捕获,省得某天凌晨三点发现订单状态算错了。



















