为什么我的约会时间遇到麻烦?

时间:2017-05-31 14:45:13

标签: php datetime

我在我正在处理的网站上有以下代码。它是由前一位开发人员编写的,所以我不确定如何处理它:

$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),则系统会中断并输出错误的答案。

1 个答案:

答案 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个月的每个月的第一个星期四,我认为比您给出的示例更容易阅读。

编辑:我已经更新了代码,因此不会跳过几个月。请参阅下面的评论。