我正在创建提醒。我需要计算给定频率和开始日期的下一个日期。频率可以每周,每月,每季度,每年。
以下代码是一个开始:
$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_date
为2014-04-01
且频率为weekly
,则会在过去为2014-04-08
创建提醒。
我需要添加逻辑以确保为将来的下一个时间间隔创建提醒。
我考虑通过确定间隔的$start_date
日来确定最近的日期,然后添加间隔。
应该是直截了当的,但这是结束漫长的一天。非常感谢社区的一些见解。
答案 0 :(得分:2)
在切换语句后尝试此操作:
$curdate = new DateTime('today');
$interval = new DateInterval($interval);
do {
$date->add($interval);
} while ($date <= $curdate);
echo $date->format('Y-m-d');
答案 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