You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:39:02