
本文详解php中使用strtotime()函数根据年份和iso周数获取当周第一天(周一)的正确方法,重点解决因周数格式不一致导致的时间戳解析失败问题,并提供可靠示例与最佳实践。
本文详解php中使用strtotime()函数根据年份和iso周数获取当周第一天(周一)的正确方法,重点解决因周数格式不一致导致的时间戳解析失败问题,并提供可靠示例与最佳实践。
在PHP中,利用strtotime()解析ISO 8601格式的“年-Week周数”(如2022-W10)是一种常见方式来获取某周的起始日期(ISO标准中每周从周一算起)。但该方法对周数格式极为敏感:必须传入两位字符串形式的周数(如"07"或"10"),而非整数或单数字字符串(如7或"7")。
原因在于:strtotime()在解析Y-Www格式时,严格遵循ISO 8601规范,要求ww部分为固定两位数字。若传入整数7,PHP会将其自动转换为字符串"7",导致格式变为2022-W7——这不符合ISO语法,strtotime()无法识别,最终返回false,进而引发date()函数警告或错误日期。
✅ 正确做法是显式将周数格式化为两位字符串:
$year = 2022;
$weeknr = 7; // 原始整数
// 强制补零为两位字符串(推荐)
$weekStr = str_pad($weeknr, 2, '0', STR_PAD_LEFT); // 得到 "07"
$timestamp = strtotime("{$year}-W{$weekStr}");
if ($timestamp === false) {
throw new InvalidArgumentException("无效的年份或周数:{$year}-W{$weekStr}");
}
echo date('Y-m-d', $timestamp); // 输出:2022-02-14(2022年第7周的周一)
? 补充说明与注意事项:
- strtotime("2022-W07") 返回的是该周周一的Unix时间戳(ISO标准);
- 若需确保跨年兼容性(例如2023-W01可能属于2022年12月),建议结合date('o-W', $timestamp)验证结果是否符合预期;
- 更健壮的替代方案是使用DateTime类(PHP ≥ 5.2):
$dt = new DateTime(); $dt->setISODate(2022, 7, 1); // 年、周、星期几(1=周一) echo $dt->format('Y-m-d'); // 同样输出 2022-02-14 - 切勿依赖date("W", $timestamp)反向验证输入周数——它返回的是字符串,但不能保证原始输入格式被保留。
总结:始终以两位字符串形式传递周数(str_pad($week, 2, '0', STR_PAD_LEFT)),并添加false校验,即可稳定、准确地获取任意ISO周的第一天日期。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











