日和月的下一次发生

时间:2019-01-17 16:17:47

标签: php

当我只给它日期和月份时,我希望能够找到它的下一次出现。我找到了有关如何查找“下周一”或如何使用另一种语言的答案,但是我不知道如何使用PHP!

例如,如果我给出函数的日期为2019-07-04(Ymd),则在2019-07-03上,返回的日期仍为2019-07-04,但在2019-07-04上,下一次出现是2020-07-04。

所以,如果我给它指定7月3日的日期,我想知道该日期下次出现吗?如果是明天或364天,那么接下来是什么时候?

2 个答案:

答案 0 :(得分:2)

您可以只检查日期是否比今天多,并保留它,或者增加一年。

function nextDate($day, $month){
    $dateObj = DateTime::createFromFormat('m-d', $month.'-'.$day);
    $today = new \DateTime();
    if($dateObj > $today){
        return $dateObj;
    }
    return $dateObj->modify('+ 1 year');
}

https://ideone.com/Nf9HWh

答案 1 :(得分:0)

老实说,我无法为relative format编写一个有效的strtotime(),这将是我们大家梦dream以求的优雅单线,所以我组成了一个穷人循环:< / p>

/**
 * @param int $month
 * @param int $day
 * @param int $reference Unix time, defaults to today
 * @return int Unix time
 */
function nextOcurrence($month, $day, $reference = null)
{
    if ($reference === null) {
        $reference = mktime(0, 0, 0);
    }
    $year = date('Y', $reference);
    while (!checkdate($month, $day, $year) || ($date = mktime(0, 0, 0, $month, $day, $year)) <= $reference){
        $year++;
    }
    return $date;
}

要点:

  • “今天”没有硬编码以简化测试。
  • 需要考虑leap年,但不能考虑Popes fiddling with the calendar
  • 它使用Unix时间戳记,因此它无法在32位PHP中处理1970年之前的日期。
  • 日期很难,所以可能是错误的。

Demo