我正在尝试确定两个日期之间的日期间隔数。间隔可以是数月,日,小时或用户选择的任何内容。
目前我有一个使用递归的函数,但是,如果两个点之间的间隔超过100个,由于递归嵌套限制,这将会中断。
private static function findCurrentInterval($initialStartTimestamp, $intervalStrtotimeFormat, $now = null, $period = 1)
{
if (is_null($now)){
$now = time();
}
$endOfCurrentInterval = strtotime($intervalStrtotimeFormat, $initialStartTimestamp);
if ($now > $initialStartTimestamp && $now < $endOfCurrentInterval){
return new self($period);
}else{
# increment the period ID tracking variable
$period++;
return self::findCurrentInterval($endOfCurrentInterval, $intervalStrtotimeFormat, $now, $period);
}
}
我需要的只是一个整数值,表示我们当前所处的时间间隔,即如果它设置为7天间隔,并且在起点和现在之间已经过了20天,它会返回'3',因为我们将进入第3期。
有没有一种方法可以在没有递归的情况下执行此操作,也许使用DateInterval?
N.B。如果它被限制在几天或几小时,这将是非常简单的 - 但它需要支持几个月,这可能有不同的长度。
答案 0 :(得分:0)
这似乎有效:
function findCurrentInterval($number, $type, $start, $end){
$dt1 = DateTime::createFromFormat('Y-m-d H:i:s', $start);
$dt2 = DateTime::createFromFormat('Y-m-d H:i:s', $end);
$diff = $dt1->diff($dt2);
$numDays = (int) $diff->format('%a');
$numMonths = (int) $diff->format('%m');
$numYears = (int) $diff->format('%y');
$numHours = (int) $diff->format('%h');
if ($numYears > 0){
$numMonths += ($numYears * 12);
}
$numHours += $numDays * 24;
switch ($type){
case 'hours':
return floor($numHours / $number);
break;
case 'days':
return floor($numDays / $number);
break;
case 'months':
return floor($numMonths / $number);
break;
default:
throw new Exception('Interval type '.$type.' not implemented.');
}
}
示例:
echo findCurrentInterval(3, 'hours', '2012-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(7, 'days', '2012-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(1, 'months', '2012-01-01 00:00:00', '2012-08-01 00:00:00');
输出:
1704
30
7
和
echo findCurrentInterval(3, 'hours', '2011-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(7, 'days', '2011-01-01 00:00:00', '2012-08-01 00:00:00');
echo findCurrentInterval(1, 'months', '2011-01-01 00:00:00', '2012-08-01 00:00:00');
输出:
4624
82
19
答案 1 :(得分:0)
这对你很有帮助
试试这个
//日基地
$start_date = '20-07-2012';
$end_date = '22-07-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;
$out='';
$int = 24*60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){
echo date('d-m-Y',$i).'<br />';
}
//月底
$start_date = '20-07-2012';
$end_date = '22-12-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;
$int = 30*24*60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){
echo date('d-m-Y',$i).'<br />';
}
//小时基数
$start_date = '20-07-2012';
$end_date = '22-12-2012';
$start = strtotime($start_date);
$end = strtotime($end_date);
$interval = 2;
$int = 60*60*$interval;
for($i= $start;$i<= $end; $i += $int ){
echo date('d-m-Y H:i:s',$i).'<br />';
}