【问题标题】:PHP - Calculate next date interval for reminderPHP - 计算提醒的下一个日期间隔
【发布时间】:2014-05-30 11:02:45
【问题描述】:

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

下面的代码是一个开始:

$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 的日期作为间隔,然后添加间隔来确定最近的日期。

应该是直截了当的,但这是漫长的一天的结束。希望社区提供一些见解。

【问题讨论】:

  • 为什么需要这个?你总是添加到给定的日期,那为什么要设置在过去呢?
  • $start_date原始提醒的日期。所以我不会总是添加。有时我正在创建(或重新启动)来自遥远过去的 $start_date 的提醒。
  • 反对者愿意分享吗?

标签: php date


【解决方案1】:

在你的 switch 语句之后试试这个:

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

demo

【讨论】:

  • 谢谢。这绝对有效。我坚持要更优雅的东西(即不是循环)。
  • +1。啊。直到现在我才明白真正的问题。
  • @Amal Murali,我发表了评论。没想到你还不明白。
  • @JasonMcCreary:不用担心。我很高兴你的问题得到了解决:)
【解决方案2】:

嗯,你的想法很正确:

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

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多