最稳妥获取本周一日期的方式是strtotime('this monday'),需先设置正确时区如date_default_timezone_set('asia/shanghai');若需周日为每周开始,则用strtotime("-" . date('w') . " days")手动计算。

PHP用date()和strtotime()算本周一日期
默认按周一为每周开始,最常用也最稳妥的方式是用strtotime('this Monday'),它会自动跳到最近一个周一(如果今天是周一,就返回今天;如果是周日,就返回昨天)。但要注意:这个结果依赖服务器时区,date_default_timezone_set()没设好会导致偏差。
实操建议:
- 先确认时区已正确设置,比如
date_default_timezone_set('Asia/Shanghai') - 直接用
date('Y-m-d', strtotime('this Monday'))获取格式化后的日期字符串 - 如果需要时间戳而非字符串,去掉
date()包装,只用strtotime('this Monday') - 避免用
'last Monday'——在周一当天会错误地回退到上上周一
PHP中DateTime类获取本周一更可控
DateTime对象比strtotime()更容易控制偏移和时区,尤其适合需要显式处理UTC或跨时区逻辑的场景。它的modify()方法对“本周一”语义更稳定。
实操建议:
- 初始化后立即用
$dt->modify('this Monday'),不要用setISODate()配合date('W')推算,容易在年初/年末出错 - 若需强制以当前日期为基准(比如今天是2024-12-31周二,要得2024-12-30周一),
new DateTime('now')+modify()是最直白的做法 - 注意
DateTime构造时若传入空字符串或null,行为在不同PHP版本中不一致,务必显式传'now'
遇到strtotime()返回false的常见原因
不是所有字符串都能被strtotime()识别,尤其混用中文、空格不规范、或系统locale影响解析时,很容易静默失败并返回false,接着date()输出1970-01-01。
典型错误现象:
-
strtotime('本周一')→ 返回false(不支持中文关键词) -
strtotime('this monday 00:00:00')→ 在部分旧版PHP中解析失败 - 服务器时区为
UTC但业务按北京时间算,导致this Monday比预期早8小时
解决办法:始终用英文关键词、校验返回值、优先用DateTime替代纯strtotime()链式调用。
需要周日作为每周开始怎么办
PHP本身没有内置“周日为始”的快捷关键字,strtotime('this Sunday')确实能拿到周日,但它在周日当天会返回当天,在周一又会跳到“下个周日”,不符合“本周”的语义。必须手动计算偏移。
实操建议:
- 用
date('w')拿到星期几(0=周日,1=周一…6=周六),再用strtotime("-" . date('w') . " days")倒推到本周日 - 更清晰写法:
$sunday = strtotime(date('Y-m-d', time()) . ' -' . (date('w') ? date('w') : 7) . ' days') - 如果项目中多处用到,封装成函数比重复写偏移逻辑更安全
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











