2015-02-26 4 views
-3

Я попытался построить и поместить цикл while по-разному и в разных местах и ​​посмотреть на значение $ val как правильную/неправильную переменную, которая будет размещаться в цикле while, но я просто не получаю ее , Я ожидал, что выход будет: 815 830 845 900 ....... до достижения 1900 года.неожиданное поведение while-loop

Вместо этого я получил 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>"; 
} 

ПРИМЕЧАНИЕ К - уценки ИГРОКОВ - Edited POST ОТВЕТ: Вы можете колотить вопрос все, что вы хотите, но дело в том, что это ясный вопрос, очевидно, цель пытается достичь, и это было очистить попытку (один из нескольких), чтобы правильно ее исправить, что не удалось, так что плохой код, неплохое усилие. Поэтому в конце концов я попросил о помощи. Вы используете систему уценки неправильно и по неправильной причине, но все, что у меня малое ожидание, что вы заботитесь. Благодаря тем, которые приложили усилия, фактически были конструктивными и преподавали/помогали.

+0

Вы хотите время, через 15 минут интервилей с того времени и до 1900 года? –

+0

Я бы избегал всей математики даты и времени и просто делал цикл на целых числах. Когда вы получите свой результат, конвертируйте его в дату/время. Это или найти количество секунд между началом и временем окончания и выполнить математику. –

+0

@dagon Да, я пытаюсь обновить значение $ val на каждом цикле с шагом 15 минут. начальное значение $ st и конечное значение равно $ et, оба из которых могут меняться, но в этом случае я просто устанавливаю значения – DMSJax

ответ

0

С unelegant цикл:

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); 
} 
+0

. Спасибо, что для принятия строк $ st и $ et мне пришлось слегка модифицировать его, чтобы включить следующее, но в любом случае поблагодарить вы. Мой подход был угадываемым. 'if (strlen ($ st) <4) {$ st =" 0 ". $ st;} if (strlen ($ et) <4) {$ st =" 0 ". $ st;} $ begin-> setTime (substr ($ st, 0,2), substr ($ st, -2), 0); $ end-> setTime (substr ($ et, 0,2), substr ($ et, -2), 0); ' – DMSJax

+0

@DMSJax Классы DateTime действительно полезны для работы с этим материалом, и я уверен, что придет в руке несколько раз. :) – OIS

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); 
Смежные вопросы