PHP中如何将周数转换为对应周的起止日期?附日期转周数代码
根据周数获取对应周的起始和结束日期(PHP实现)
我懂你的需求啦——已经能用date("W")把日期转成01-53格式的年度周数,现在想反过来,根据给定的年份和周数,拿到这周的起始和结束日期对吧?下面给你两种实用的实现方式,都是贴合PHP里ISO周规则的(毕竟你用的date("W")遵循ISO-8601标准:周一为每周第一天,一年的第一周至少包含4天在当年)。
方法一:用strtotime快速实现
strtotime支持相对时间格式,直接可以通过年份+周数定位到对应周的某天:
// 定义目标年份和周数 $targetYear = 2012; $targetWeek = 53; // 对应你例子里的日期计算出的周数 // 获取该周的起始日期(周一,ISO周的默认起始) $startDate = date("Y-m-d", strtotime("{$targetYear}-W{$targetWeek}-1")); // 获取该周的结束日期(周日) $endDate = date("Y-m-d", strtotime("{$targetYear}-W{$targetWeek}-7")); // 输出结果 echo "第{$targetWeek}周的起始日期:{$startDate},结束日期:{$endDate}";
这里的-1和-7分别代表该周的周一和周日,完全匹配date("W")的周定义逻辑。
方法二:用DateTime类(更可靠,推荐)
如果需要处理跨年度的周(比如某周的部分日期在上一年,部分在下一年),用面向对象的DateTime类会更稳妥,它能自动处理这些边界情况:
$targetYear = 2012; $targetWeek = 53; // 初始化DateTime对象,按ISO周设置日期 $dateObj = new DateTime(); $dateObj->setISODate($targetYear, $targetWeek); // 起始日期默认是该周的周一 $startDate = $dateObj->format("Y-m-d"); // 加6天得到该周的周日(结束日期) $dateObj->modify('+6 days'); $endDate = $dateObj->format("Y-m-d"); // 输出结果 echo "第{$targetWeek}周的起始日期:{$startDate},结束日期:{$endDate}";
比如你例子里的2012-12-30,用date("W")计算的话,实际它属于2013年的第1周(ISO规则下),用这个方法就能准确返回对应的跨年度日期范围。
额外注意事项
- 如果你的业务场景是周日为每周起始,只需要调整逻辑:比如用
setISODate定位到周一后,modify('-1 day')得到该周的周日(起始),再加6天到周六(结束)。 - 一定要确保周数是
01-53的两位格式,不要省略前导零(比如用05而不是5),否则strtotime或setISODate可能会解析出错。
内容的提问来源于stack exchange,提问作者dipenparmar12
相关产品推荐
相关产品推荐

