Php 为什么我的约会时间在31号有问题?

Php 为什么我的约会时间在31号有问题?,php,datetime,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-

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

$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

i、 e.2017年7月5日、2017年8月3日、2017年9月7日(这是相关月份的第一个星期四)


代码在大多数日期都可以正常工作,但由于某种原因,我无法理解如果超过了一个月的31号(即2017-05-31),系统会中断并输出错误的答案。

我认为此代码不必要地复杂。此外,如果给定的日期是31号,并且您尝试添加1个月,那么您的情况是,它试图查找下个月的31号,而下个月的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');
}
$currentDate=new\DateTime();
$iterations=10;
对于($i=0;$i<$iterations;$i++){
$first\u星期四=新建\DateTime(
sprintf('s'的第一个星期四,$currentDate->格式('fy'))
);
$nextDate=new\DateTime($currentDate->format('Y-m-d');
$nextDate->add(new\DateInterval('P1M'));
如果($nextDate->format('m')>$currentDate->format('m')+1){
$nextDate->sub(new\DateInterval('P1D');
}
$currentDate=$nextDate;
echo$first_周四->格式('Y-m-d');
}
在接下来的10个月里,这将给你每个月的第一个星期四,我认为这比你给出的例子更容易阅读


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

为什么是Y-m-01而不是Y-m-d或Y-m-j@clearshot66因为他每个月的第一个星期四。明白了,出于好奇,他看错了方向,你有没有理由不使用类似于
date('Y-m-d',strotime('2017年5月的第一个星期四'),根据需要替换循环中的月份和年份?@OK。我认为我的建议对未来的开发人员来说可能更容易理解,因此如果您能够重构此代码,那么您可能希望抓住这个机会!坚持我犯了一个错误。如果它在31号运行,有时会跳过几个月。让我修改一下,我来编辑。我已经纠正了那个错误。很抱歉。我现在正在检查以确保添加P1M的结果实际上是在下个月。如果不是,则减去一天以确保它是,例如:将P1M添加到2017-05-31结果2017-07-01。减去P1D得到2017-06-30,这是我们想要的年份和月份。您也可以在开始时做一些欺骗,以避免第31个跳过月份的问题:
$currentDate=new\DateTime(“本月的第一天”)