php8中获取本周一最稳妥的方法是:先用date_create()获取当前日期,再用date_format($dt, 'w')获取数字星期,按公式$offset = ($w === 0) ? 6 : $w - 1计算偏移量,最后modify("-{$offset} days")。

PHP8 中用 date_create() 配合 modify() 获取本周一日期
PHP8 默认启用严格模式,strtotime() 对模糊时间字符串(如 "this week")的解析行为在某些时区下可能不一致,推荐用面向对象方式明确控制起始日。PHP 的周默认以周日为第一天,但业务中“本周”通常指周一到周日,所以必须显式定位到周一。
实操建议:
-
date_create('this monday')在大多数情况下能返回本周一,但若当天是周日,它会返回**下周一**——这是常见误判点 - 更稳妥的做法是先获取今天,再回溯到最近一个周一:
$today = date_create();<br>$monday = clone $today;<br>$monday->modify('this monday');<br>// 如果今天是周一,$monday 就是今天;如果是周日,$monday 是昨天(即上周一)→ 错! - 正确逻辑:先取本周日,再加一天得下周一,再减七天得本周一:
$now = date_create();<br>$sunday = clone $now;<br>$sunday->modify('this sunday');<br>$monday = clone $sunday;<br>$monday->modify('+1 day'); // 下周一<br>$monday->modify('-7 days'); // 本周一
用 date_weekday 和算术计算避免依赖自然语言解析
用 date_format($dt, 'w') 获取数字星期(0=周日,1=周一…6=周六),再通过减法直接算出周一日期,完全绕过 modify() 的语义歧义,兼容性最强,也最容易调试。
实操建议:
-
date_format($dt, 'w')返回的是整数,不是字符串,可直接参与运算 - 若今天是周三(
w = 3),往前推 2 天就是周一;若今天是周一(w = 1),推 0 天;若今天是周日(w = 0),需推 6 天 → 统一公式:$offset = ($w === 0) ? 6 : $w - 1; - 完整写法:
$now = date_create();<br>$w = (int) date_format($now, 'w');<br>$offset = ($w === 0) ? 6 : $w - 1;<br>$monday = clone $now;<br>$monday->modify("-{$offset} days");<br>echo date_format($monday, 'Y-m-d'); // 如 2024-06-10
注意时区设置对 date_create() 结果的影响
PHP8 不再隐式使用系统时区,未设时区时 date_create() 可能返回 UTC 时间,导致日期错位一天。尤其部署在 Docker 或云函数中时,这个坑几乎必踩。
实操建议:
- 务必在脚本开头或配置中显式设置:
date_default_timezone_set('Asia/Shanghai'); - 不要依赖
ini_set('date.timezone', ...),它在 CLI 模式下可能无效 - 验证是否生效:
var_dump(date_default_timezone_get());输出应为预期时区名,而非UTC或空字符串
如果项目已用 Carbon,别重复造轮子
Carbon 3.x 完全兼容 PHP8,并内置了可靠的周计算方法,比原生更少出错。只要 Composer 已引入,就优先用它。
实操建议:
-
Carbon::now()->startOfWeek()默认返回周一,且自动处理时区和本地化 - 如需强制 ISO 周(周一为第一天),加参数:
Carbon::now()->startOfWeek(Carbon::MONDAY) - 注意 Carbon 2.x 的
startOfWeek()在某些版本中默认是周日,升级到 3.x 可规避
实际业务里,“本周”含义常被产品文档忽略,比如是否包含今天、跨月时如何定义。代码里硬编码“周一为起点”前,最好确认下需求方的真实意图——有时他们说的“本周”其实是“过去 7 天”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











