PHP中两日期间日期/月份显示异常:短区间不显示5月
嘿,我来帮你解决这个问题!你遇到的情况是因为DatePeriod生成月份的逻辑导致的——当起始日期是4月26日时,加一个月后得到的是5月26日,而你的结束日期加1天后是5月4日,5月26日已经超过了这个结束日期,所以DatePeriod不会把5月纳入结果里。但如果日期范围更大(比如到6月),5月26日就不会超过结束日期,自然就能显示5月了。
下面给你两种靠谱的解决方案:
方案一:调整月份遍历的起始和结束日期
把月份遍历的起始日期改成当月第一天,结束日期改成结束日期所在月的最后一天再加1天,这样就能确保所有涉及到的月份都会被包含:
// 查找两个日期之间的所有日期及月份 $startDate = new DateTime("2018-04-26"); $inputEndDate = new DateTime("2018-05-03"); // 遍历所有日期(原逻辑保留,确保包含结束日期) echo "所有日期:<br>"; $endDateForDays = clone $inputEndDate; $endDateForDays->modify('+1day'); $datePeriod = new DatePeriod($startDate, new DateInterval('P1D'), $endDateForDays); foreach ($datePeriod as $date) { echo $date->format('Y-m-d') . "<br>"; } // 遍历所有月份(调整起始和结束日期) echo "<br>所有月份:<br>"; $monthStart = clone $startDate; $monthStart->modify('first day of this month'); // 设为当月第一天 $monthEnd = clone $inputEndDate; $monthEnd->modify('last day of this month')->modify('+1day'); // 设为结束月最后一天加1天 $monthInterval = new DateInterval('P1M'); $monthPeriod = new DatePeriod($monthStart, $monthInterval, $monthEnd); foreach ($monthPeriod as $month) { echo $month->format('Y-m') . "<br>"; }
方案二:直接计算月份差并循环生成
这种方法更直观,不用依赖DatePeriod的自动判断,直接对比起始和结束的月份,循环生成所有中间月份:
// 查找两个日期之间的所有日期及月份 $startDate = new DateTime("2018-04-26"); $inputEndDate = new DateTime("2018-05-03"); // 遍历所有日期(原逻辑保留) echo "所有日期:<br>"; $endDateForDays = clone $inputEndDate; $endDateForDays->modify('+1day'); $datePeriod = new DatePeriod($startDate, new DateInterval('P1D'), $endDateForDays); foreach ($datePeriod as $date) { echo $date->format('Y-m-d') . "<br>"; } // 遍历所有月份(直接循环) echo "<br>所有月份:<br>"; $currentMonth = new DateTime($startDate->format('Y-m')); $endMonth = $inputEndDate->format('Y-m'); while ($currentMonth->format('Y-m') <= $endMonth) { echo $currentMonth->format('Y-m') . "<br>"; $currentMonth->modify('+1month'); }
这两种方法都能解决小范围日期下看不到5月的问题,你可以根据自己的需求选择。
内容的提问来源于stack exchange,提问作者Monirul Islam
相关产品推荐
相关产品推荐

