我想生成一个基于时间间隔数组的值的表,其中显示每个周期的开始和结束日期。周期可以固定间隔,例如(P1D,P1M等)。
我已经有一个生成关闭(过去)时间段的函数,但是我找不到找到将来日期的方法。
这是功能:
function interval($start, $interval, $break = 0)
{
$result = array();
$today = date("Y-m-d");
if ($break == 0) {
if ($today < $start) $break = 1;
}
$date = new DateTime($start);
$interval = new DateInterval($interval);
$f1 = date('Y-m-d', strtotime($start));
$x = TRUE;
if ($break == 0) {
do {
$date->add($interval);
$f2 = $date->format('Y-m-d');
$result[] = array(
'begin' => $f1,
'end' => $f2
);
$x = ($f1 <= $today && $f2 >= $today) ? TRUE : FALSE;
$f1 = date('Y-m-d', strtotime('+1 day', strtotime($f2)));
} while (!$x);
} else {
for ($n = 1; $n <= $break; $n++) {
$date->add($interval);
$f2 = $date->format('Y-m-d');
$result[] = array(
'begin' => $f1,
'end' => $f2
);
$f1 = date('Y-m-d', strtotime('+1 day', strtotime($f2)));
}
}
return $result;
}
只需调用函数即可使用:
print_r(interval('2019-01-01', 'P1M'));
结果如下:
(
[0] => Array
(
[begin] => 2019-01-01
[end] => 2019-02-01
)
[1] => Array
(
[begin] => 2019-02-02
[end] => 2019-03-01
)
)
我希望做同样的事情,但是要在将来的一段时间内进行,例如,以1个月的间隔(P1M)从01-01-2019到01-01-2023。
更新
@dWinder的答案是我所寻找的解决方案中最接近的内容,而不必花费时间=),它在每月和每年的时间间隔内都非常有效,但周期较短(P15D,P1W,P1D),该脚本出现了我无法识别的问题。
我更新了您发布的函数,以便它正确地遍历数组并保持如下状态:
function interval($start, $interval, $maxPeriods = 100, $end = NULL) {
$result = array();
//$today = date("Y-m-d"); ** Variable not used, disable it **
$date = new DateTime($start);
$interval = new DateInterval($interval);
$f1 = date('Y-m-d', strtotime($start));
do {
$date->add($interval);
$f2 = $date->format('Y-m-d');
$result[] = array( 'begin' => $f1, 'end' => $f2);
if ($end <> NULL && $end == $f2) break; // if over the end date stop the loop
$f1 = date('Y-m-d', strtotime('+1 day', strtotime($f2)));
} while (++$maxPeriods); // I changed -- to ++ to avoid stopping the loop
return $result;
}
更新后的功能以这种方式使用:
print_r(interval('2019-01-01', 'P1M', NULL, '2023-01-01'));
结果:
(
[0] => Array
(
[begin] => 2019-01-01
[end] => 2019-02-01
)
[1] => Array
(
[begin] => 2019-02-02
[end] => 2019-03-01
)
[2] => Array
(
[begin] => 2019-03-02
[end] => 2019-04-01
)
[3] => Array
(
[begin] => 2019-04-02
[end] => 2019-05-01
)
[4] => Array
(
[begin] => 2019-05-02
[end] => 2019-06-01
)
[5] => Array
(
[begin] => 2019-06-02
[end] => 2019-07-01
)
[6] => Array
(
[begin] => 2019-07-02
[end] => 2019-08-01
)
[7] => Array
(
[begin] => 2019-08-02
[end] => 2019-09-01
)
[8] => Array
(
[begin] => 2019-09-02
[end] => 2019-10-01
)
[9] => Array
(
[begin] => 2019-10-02
[end] => 2019-11-01
)
[10] => Array
(
[begin] => 2019-11-02
[end] => 2019-12-01
)
[11] => Array
(
[begin] => 2019-12-02
[end] => 2020-01-01
)
)...
答案 0 :(得分:1)
更好的解决方案是发送“ end”参数并进行检查(除了“ maxPeriods”之外
考虑以下内容(注意代码中的注释):
function interval($start, $interval, $maxPeriods = 100, $end = null) {
$result = array();
$today = date("Y-m-d");
$date = new DateTime($start);
$interval = new DateInterval($interval);
$f1 = date('Y-m-d', strtotime($start));
do {
$date->add($interval);
$f2 = $date->format('Y-m-d');
$result[] = array( 'begin' => $f1, 'end' => $f2);
if ($end && $end < $f2) break; // if over the end date stop the loop
$f1 = date('Y-m-d', strtotime('+1 day', strtotime($f2)));
} while (--$maxPeriods); //till you get max elements
return $result;
}
现在用
调用print_r(interval('2019-01-01', 'P1M', 48));
//or
print_r(interval('2019-01-01', 'P1M', null, "2023-01-01"));
请注意,第一个角色遇到中断循环(结束日期或最多元素)
答案 1 :(得分:0)
时间机器会有所帮助:)如果程序正确地计算了过去的时间段,那么如果今天“认为”是“ 2023-01-01”(给予或接受),它将正确地计算过去的时间段。您可以添加$end
参数,默认为今天吗?