
PHP 的 strtotime() 函数支持 Y-Www 格式解析周日期,但要求周数必须为两位字符串(如 "07"),若传入整数 7 或 "7" 会导致解析失败或返回错误时间戳。
php 的 `strtotime()` 函数支持 `y-www` 格式解析周日期,但要求周数必须为**两位字符串**(如 `"07"`),若传入整数 `7` 或 `"7"` 会导致解析失败或返回错误时间戳。
在 PHP 中,使用 strtotime("2022-W10") 可以便捷地获取某年第 N 周的起始日期(ISO 8601 标准:每周从周一算起,第 1 周包含该年第一个周四)。但该语法对周数格式极为敏感——必须是严格两位宽度的字符串(例如 "09" 而非 9 或 "9")。
这是因为 strtotime() 在解析 Y-Www 时,底层依赖 C 库的 strptime 行为,当 ww 部分不足两位或为整数时,可能被截断、忽略或触发未定义行为,导致返回 false 或错误时间戳(如 Unix 纪元时间)。
✅ 正确用法(推荐):
$year = 2022;
$weeknr = 9; // 原始整数
// 自动补零为两位字符串
$weekStr = str_pad((string)$weeknr, 2, '0', STR_PAD_LEFT); // → "09"
$timestamp = strtotime("{$year}-W{$weekStr}");
if ($timestamp === false) {
throw new InvalidArgumentException("Invalid year-week combination: {$year}-W{$weekStr}");
}
echo date('Y-m-d (D)', $timestamp); // 输出:2022-02-28 (Mon)
⚠️ 注意事项:
- ISO 周计算以周一为每周首日,且第 1 周必须包含当年第一个周四(因此 2022 年第 1 周始于 2022-01-03);
- strtotime() 对无效周数(如 "2022-W54" 在非闰年)可能静默失败,建议始终校验返回值;
- 若需更高可靠性与类型安全,可改用 DateTime::createFromFormat():
$date = DateTime::createFromFormat('o-\WW', "2022-W09"); echo $date ? $date->format('Y-m-d') : 'Invalid week';
? 总结:永远将周数格式化为两位字符串(str_pad($n, 2, '0', STR_PAD_LEFT)),避免隐式类型转换引发的解析歧义——这是确保 Y-Www 语法稳定工作的关键实践。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











