我尝试以不同的方式和不同的位置构建和放置while循环,并将$ val视为正确/错误的变量放置在while循环中,但我只是没有得到它。我预计输出为:815 830 845 900 .......直到1900年。
相反,我得到815然后1915 1930 1945直到0000然后它从1915年开始循环。有人请告诉我我在错误的位置放置了什么或者我错误地使用了什么变量。
date_default_timezone_set('America/New_York');
$st='800';
$et='1900';
$frac = 900;
$x = $et;
$val=0;
if (strlen($st) < 4) {$st = "0".$st;}
$current_time = strtotime(date($st));
$r = $current_time % $frac;
$new_time = $current_time + ($frac-$r);
$val = date('Gi', $new_time);
echo $val."<br>";
while ($val !== $et){
if (strlen($val) < 4) {$st = "0".$val;}
$current_time = strtotime('+ 15 minutes',date($val));
$r = $current_time % $frac;
$new_time = $current_time + ($frac-$r);
$val = date('Gi', $new_time);
echo $val."<br>";
}
注意 - 标记球员 - 编辑后的答案:你可以打破所有你想要的问题,但事实是这是一个明确的问题,明确的目标试图达到它是一个明确的尝试(几个中的一个)正确编码失败,如此糟糕的代码,不是很糟糕的努力。所以最终我求助了。你使用降价系统是错误的方式和错误的原因,但无论我对你关心的期望不高。感谢那些使这项努力真正具有建设性并教导/帮助的人。
答案 0 :(得分:0)
对于不合适的循环:
for ($i = 800, $t= 1900; $i <= $t; $i += 15) {
printf('%1$3d <br>', $i);
if ($i%100 >= 45) $i += 40;
}
使用DatePeriod:
$timezone = new DateTimeZone("America/New_York");
$begin = new DateTime("now", $timezone);
$begin->setTime(8, 0, 0);
$end = new DateTime("now", $timezone);
$end->setTime(19, 0, 0);
$interval = new DateInterval('PT15M');
$end->add($interval);
$daterange = new DatePeriod($begin, $interval ,$end);
foreach($daterange as $date){
echo $date->format("Gi") . "<br>";
}
使用发电机:
function xmins($start, $end, $step = 15) {
if ($start < $end) {
if (($step <= 0) || ($step >= 40)) {
throw new LogicException('Step must be in range 1-40');
}
for ($i = $start; $i <= $end; $i += $step) {
if (60 <= $temp = $i % 100) {
$i += 40;
}
yield $i;
if ((60-$step) === $temp = $i % 100) {
$i += 100 - $temp - $step;
}
}
}
}
foreach (xmins(800,1900,15) as $i) {
printf('%1$3d<br>', $i);
}
答案 1 :(得分:0)
使用DateInterval:
$date = new DateTime('2015-01-01 08:00:00');
$mins = new DateInterval('PT15M');
do {
$date->add($mins);
echo $date->format('Hi')."\n";
} while($date->format('Hi') < 1900);