意外的 while 循环行为
unexpected while-loop behavior
我试过以不同的方式和不同的位置构建和放置 while 循环,并将 $val 视为要放置在 while 循环中的 right/wrong 变量,但我就是不明白。我预计输出为: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>";
}
给 - MARKDOWN 玩家的注意事项 -- 已编辑 POST 答案:你可以 bash 你想要的任何问题,但事实是它是一个明确的问题,明确 objective 试图达到,这是一个明确的尝试(几次之一)正确编码但失败了,如此糟糕的代码,而不是糟糕的努力。所以最终我寻求帮助。你以错误的方式和错误的理由使用降价系统,但我不希望你关心。感谢那些使努力真正具有建设性的人 teach/help.
使用不优雅的 for 循环:
for ($i = 800, $t= 1900; $i <= $t; $i += 15) {
printf('%1d <br>', $i);
if ($i%100 >= 45) $i += 40;
}
日期时间段:
$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('%1d<br>', $i);
}
使用日期间隔:
$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);
我试过以不同的方式和不同的位置构建和放置 while 循环,并将 $val 视为要放置在 while 循环中的 right/wrong 变量,但我就是不明白。我预计输出为: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>";
}
给 - MARKDOWN 玩家的注意事项 -- 已编辑 POST 答案:你可以 bash 你想要的任何问题,但事实是它是一个明确的问题,明确 objective 试图达到,这是一个明确的尝试(几次之一)正确编码但失败了,如此糟糕的代码,而不是糟糕的努力。所以最终我寻求帮助。你以错误的方式和错误的理由使用降价系统,但我不希望你关心。感谢那些使努力真正具有建设性的人 teach/help.
使用不优雅的 for 循环:
for ($i = 800, $t= 1900; $i <= $t; $i += 15) {
printf('%1d <br>', $i);
if ($i%100 >= 45) $i += 40;
}
日期时间段:
$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('%1d<br>', $i);
}
使用日期间隔:
$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);