如何用循环替代硬编码获取上个月的五个周六日期?
用循环实现获取上个月的五个周六日期
嘿,这个需求用循环来实现确实比硬编码舒服多了!硬编码重复代码太多,维护起来也麻烦,循环的方式不仅简洁,还能自动适配不同月份的情况。
核心思路
先拿到上个月第一个周六的时间戳,然后每次给这个时间戳加上7天的秒数,循环5次就能得到连续的五个周六日期啦——毕竟每周六之间正好间隔7天,这个逻辑非常可靠。
完整代码示例
// 获取上个月第一个周六的时间戳 $firstSatTimestamp = strtotime("first saturday of last month"); $saturdayDates = []; // 循环生成5个周六的日期 for ($i = 0; $i < 5; $i++) { // 计算当前循环对应的周六时间戳:第一个周六 + i*7天的秒数 $currentSatTimestamp = $firstSatTimestamp + ($i * 7 * 24 * 60 * 60); // 格式化为你需要的dd-mm-yy格式 $saturdayDates[] = date("d-m-y", $currentSatTimestamp); } // 输出结果(和示例格式一致,用逗号分隔) echo implode(", ", $saturdayDates);
代码解释
- 获取起始时间戳:
strtotime("first saturday of last month")是PHP自带的语义化时间解析,能精准定位到上个月的第一个周六,不用自己计算日期差,非常省心。 - 循环生成日期:循环5次,每次给起始时间戳加上
7*24*60*60秒(也就是7天的秒数),这样每次得到的都是下一个周六的时间戳。 - 格式化输出:用
date("d-m-y")把时间戳转成你需要的日-月-两位年格式,最后用implode把数组转成逗号分隔的字符串,和你的示例输出完全匹配。
额外小提示
如果遇到上个月只有4个周六的情况(比如2024年2月只有4个周六),这个代码会生成第五个周六(也就是当月的第一个周六)。如果需要严格只输出上个月的周六,可以在循环里加个判断,检查生成的日期是否属于上个月:
$lastMonth = date("m", strtotime("last month")); for ($i = 0; $i < 5; $i++) { $currentSatTimestamp = $firstSatTimestamp + ($i * 7 * 24 * 60 * 60); if (date("m", $currentSatTimestamp) == $lastMonth) { $saturdayDates[] = date("d-m-y", $currentSatTimestamp); } }
这样就只会收集属于上个月的周六啦~
内容的提问来源于stack exchange,提问作者Devendra Vastrakar
相关产品推荐
相关产品推荐

