PHP - 计算提醒的下一个日期间隔

时间:2014-04-15 21:20:44

标签: php date

我正在创建提醒。我需要计算给定频率和开始日期的下一个日期。频率可以每周每月每季度每年

以下代码是一个开始:

$date = new DateTime($start_date);
switch ($frequency) {
    case: 'weekly'
        $interval = 'P1W';
        break;
    case: 'monthly'
        $interval = 'P1M';
        break;
    case: 'quarterly'
        $interval = 'P3M';
        break;
    case: 'annually'
        $interval = 'P1Y';
        break;
}

$date->add(new DateInterval($interval));
echo $date->format('Y-m-d');

问题是$start_date可能在遥远的过去。

例如,如果$start_date2014-04-01且频率为weekly,则会在过去为2014-04-08创建提醒。

我需要添加逻辑以确保为将来的下一个时间间隔创建提醒。

我考虑通过确定间隔的$start_date日来确定最近的日期,然后添加间隔。

应该是直截了当的,但这是结束漫长的一天。非常感谢社区的一些见解。

2 个答案:

答案 0 :(得分:2)

在切换语句后尝试此操作:

$curdate = new DateTime('today');
$interval = new DateInterval($interval);
do {
    $date->add($interval);
} while ($date <= $curdate);
echo $date->format('Y-m-d');

demo

答案 1 :(得分:1)

对你而言,这是非常正确的想法:

I thought about determining the recent date by determining the day of $start_date for the interval, then adding the interval.

您可以使用一个漂亮的小递归函数为您完成所有这些,例如

<?php

    $frequency = 'weekly';
    $last_date_we_have = '2014-01-02';

    $valid_reminder_date = get_next_reminder_date($last_date_we_have, $frequency);

    echo ' Next valid reminder date = ' . $valid_reminder_date;
    exit;

function get_next_reminder_date($start_date, $frequency)
{
    $date = new DateTime($start_date);
    switch ($frequency) {
        case 'weekly' :
            $interval = 'P1W';
            break;
        case 'monthly' :
            $interval = 'P1M';
            break;
        case 'quarterly' :
            $interval = 'P3M';
            break;
        case 'annually' :
            $interval = 'P1Y';
            break;
    }

    $date->add(new DateInterval($interval));

    if ( time() > $date->getTimestamp() ) {
        echo $date->format('Y-m-d');
        echo ' Not there yet' . PHP_EOL;
        return get_next_reminder_date($date->format('Y-m-d'), $frequency);
    } else {
        return $date->format('Y-m-d');
    }
}

使用示例中的输入结果为:

2014-01-09 Not there yet
2014-01-16 Not there yet
2014-01-23 Not there yet
2014-01-30 Not there yet
2014-02-06 Not there yet
2014-02-13 Not there yet
2014-02-20 Not there yet
2014-02-27 Not there yet
2014-03-06 Not there yet
2014-03-13 Not there yet
2014-03-20 Not there yet
2014-03-27 Not there yet
2014-04-03 Not there yet
2014-04-10 Not there yet
Next valid reminder date = 2014-04-17