我在我正在处理的网站上有以下代码。它是由前一位开发人员编写的,所以我不确定如何处理它:
$datetime = new DateTime("$dt_start_ymd +$gap month");
$dt_next = new DateTime("Thursday " . $datetime->format('Y-m-01'));
$dt_next_0 = $dt_next->setTime(02, 00)->getTimestamp();
$dt_next = $dt_next->getTimestamp();
变量$gap
是递增计数(1,2,3等)。上面的代码应输出一系列日期,列出每个月的第一个星期几,持续数月,如$gap
所示
即。 2017年7月5日,2017年8月3日,2017年9月7日(那些是相应月份的第一个星期四)。
代码在大多数日期都可以正常工作,但由于某个原因我无法理解,如果它传递的是一个月的31日(即2017-05-31),则系统会中断并输出错误的答案。
答案 0 :(得分:2)
我认为这段代码不必要地复杂化。此外,如果给定日期是第31个并且您尝试添加1个月,那么您最终会遇到它正试图找到下个月的第31个月的情况,这个情况除了在12月 - > 1月。
您可能需要考虑类似
的内容$currentDate = new \DateTime();
$iterations = 10;
for ($i = 0; $i < $iterations; $i++) {
$first_thursday = new \DateTime(
sprintf('first Thursday of %s', $currentDate->format('F Y'))
);
$nextDate = new \DateTime($currentDate->format('Y-m-d'));
$nextDate->add(new \DateInterval('P1M'));
if ($nextDate->format('m') > $currentDate->format('m') + 1) {
$nextDate->sub(new \DateInterval('P1D'));
}
$currentDate = $nextDate;
echo $first_thursday->format('Y-m-d');
}
这将为您提供未来10个月的每个月的第一个星期四,我认为比您给出的示例更容易阅读。
编辑:我已经更新了代码,因此不会跳过几个月。请参阅下面的评论。