最直接方法是用 date('w', $timestamp) 判断周末:返回 0(周日)或 6(周六)即为周末;需先将字符串日期通过 datetime::createfromformat() 转为时间戳并校验有效性,同时统一设置时区如 'asia/shanghai' 避免偏差。

用 date() 判断星期几最直接
PHP 里判断某天是不是周末,核心就看它是星期六还是星期日。最常用、最稳的办法是用 date('w', $timestamp):返回 0 表示周日,6 表示周六。date('N', $timestamp) 也可以,它按 ISO 标准返回 1(周一)到 7(周日),周末就是 6 和 7。
注意别用 date('l')(返回英文全称)做判断——大小写、本地化、拼写误差都容易翻车。
-
date('w')返回数字,简单可靠,但 0 是周日,容易误以为“0 = 无”而漏判 - 如果传入的日期字符串没带时区或格式不规范,
strtotime()可能解析出错,建议先用DateTime::createFromFormat()显式指定格式 - 时间戳为 0(1970-01-01)时,
date('w')返回 4(周四),不是边界陷阱,但测试时别只用今天
处理字符串日期时先转成时间戳再判断
用户输入的往往是 "2024-06-15" 这类字符串,不能直接丢给 date()。必须先用 strtotime() 或 DateTime 转成时间戳或对象。
推荐用 DateTime,尤其当日期格式不确定或含中文/分隔符异常时:DateTime::createFromFormat('Y-m-d', '2024-06-15') 比 strtotime() 更可控,失败时返回 false,方便检查。
立即学习“PHP免费学习笔记(深入)”;
-
strtotime('2024/06/15')在某些 PHP 版本下可能解析成 0,导致date('w', 0)错误返回 4 - 用
DateTime后记得调用getTimestamp()再传给date(),或者直接用$dt->format('w') - 避免用
date('w')直接套strtotime($input),万一$input是非法字符串,strtotime()返回false,会被当成 0 处理
判断逻辑写成函数更安全
把判断封装成小函数,能避免重复写条件、也方便单元测试。关键点在于明确“周末”的定义:国内通常指周六、周日;有些业务可能把周五下午也算“准周末”,那就得单独扩展。
一个简洁可靠的函数长这样:
function isWeekend($dateString) {
$dt = DateTime::createFromFormat('Y-m-d', $dateString);
if (!$dt || $dt->format('Y-m-d') !== $dateString) return false;
return in_array($dt->format('w'), ['0', '6']);
}
- 必须校验
DateTime::createFromFormat()的返回值是否为false,否则后续调用会报 Warning - 加一句
$dt->format('Y-m-d') !== $dateString是为了过滤掉像"2024-02-30"这种非法但被强行归到下月的日期 - 别用
==比较字符串和数字,'0' == 0为 true,但'0'和0类型不同,in_array()默认用松散比较,所以显式写成字符串数组更稳妥
时区不一致会导致判断错误
服务器时区和业务所在时区不一致时,date('w') 看到的“今天”可能不是用户说的“今天”。比如服务器在 UTC,用户在北京,2024-06-15 00:00:00 UTC 对应北京时间是 08:00,但用默认时区算出来可能是周五。
- 统一用
date_default_timezone_set('Asia/Shanghai')开头设置,比每次 new DateTime 时传时区更省心 - 如果项目已用
DateTimeZone做多时区处理,务必确保创建DateTime对象时指定了正确时区:new DateTime($dateString, new DateTimeZone('Asia/Shanghai')) - 数据库里存的时间戳如果是 UTC,读出来后要先 setTimeZone 再 format,否则
format('w')仍按默认时区算
真正麻烦的不是代码怎么写,而是你忘了时区在哪一层被悄悄改过——查 bug 时先盯住 date_default_timezone_get() 的输出。











