Php.Advance еженедельный календарь на неделю

Возможный дубликат:
Получить следующую / предыдущую ISO-неделю и год в PHP

Я пытаюсь написать сценарий, который будет отображать дни недели в таблице, и будет продвигаться на неделю, если нажимается кнопка. Мне удалось заставить его работать до того момента, когда он достигнет конца года, а затем все даты идут не так. Он есть то, что у меня есть до сих пор …

<? if(isset($_POST['add_week'])){ $week = date('dm-Y', strtotime($_POST['last_week'])); $new_week = strtotime ( '+1 week' , strtotime ( $week ) ) ; $new_week = date('dm-Y', $new_week); $week_number = date("W", strtotime( $new_week)); $year = date("Y", strtotime( $new_week)); }else{ $week_number = date("W"); $year = date("Y"); } if($week_number < 10){ $week_number = "0".$week_number; } $week_start = date('dm-Y', strtotime($year."W".$week_number,0)); echo $week.' '.$new_week.' '.$week_number; ?> <table name="week"> <tr> <? for($day=1; $day<=7; $day++) { echo '<td>'; echo date('dm-Y', strtotime($year."W".$week_number.$day))." | \n"; echo '</td>'; } ?> </tr> <tr> <form name="move_weeks" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="hidden" name="last_week" value="<? echo $week_start; ?>" /> <td colspan="7"><input type="submit" name="back_week" value="back_week" /> <input ype="submit" name="add_week" value="add_week" /> </td> </form> </tr> </table> 

Некоторые из значений были echo'd, поэтому я могу проверить, что передаваемые значения верны, и я знаю, что я, вероятно, сделал дополнительные шаги, которые мне не нужны, но я довольно новичок в этом и хотел сделать код проще пока я работаю. Как я уже сказал, кнопка добавления работает с удовольствием, пока не наступит новый год.

благодаря

Хорошо, сделал некоторое продвижение, отлично работает до тех пор, пока он не доберется до 2012 года, тогда он просто продлится до 2012 года, а не начнется в 2013 году

  <? if(isset($_POST['add_week'])){ $week = date('dm-Y', strtotime($_POST['last_week'])); $new_week = strtotime ( '+1 week' , strtotime ( $week ) ) ; $new_week = date('dm-Y', $new_week); $week_number = date("W", strtotime( $new_week)); $year = date("Y", strtotime( $new_week)); }else if(isset($_POST['back_week'])){ $week = date('dm-Y', strtotime($_POST['last_week'])); $new_week = strtotime ( '-1 week' , strtotime ( $week ) ) ; $new_week = date('dm-Y', $new_week); $week_number = date("W", strtotime( $new_week)); $year = date("Y", strtotime( $new_week)); }else{ $week_number = date("W"); $year = date("Y"); } /*if($week_number < 10){ $week_number = "0".$week_number; }*/ $week_start = date('dm-Y', strtotime($year."W".$week_number,0)); echo $week.' '.$new_week.' '.$week_number; ?> <table name="week"> <tr> <? for($day=1; $day<=7; $day++) { echo '<td>'; echo date('dm-Y', strtotime($year."W".$week_number.$day))." | \n"; echo '</td>'; } ?> </tr> <tr> <form name="move_weeks" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>"> <input type="hidden" name="last_week" value="<? echo $week_start; ?>" /> <td colspan="7"><input type="submit" name="back_week" value="back_week" /><input type="submit" name="add_week" value="add_week" /> </td> </form> </tr> </table> 

По-моему, вы лучше всего сможете сделать все ваши вычисления на основе значения timestamp unix, а затем преобразовать в строку только по мере необходимости для вывода. Таким образом, вам не нужно иметь дело с проблемами с номерами недель (например, с неделей 0), вы не ограничены тем, что понедельник будет первым днем ​​каждой недели (как это и является основой расчета в date("W") ), и вам не придется создавать кучу хаков, чтобы искать краевые условия.

$_POST['last_week'] что $_POST['last_week'] находится в вашем формате dmY примерно так:

 if(isset($_POST['add_week'])){ $last_week_ts = strtotime($_POST['last_week']); $display_week_ts = $last_week_ts + (3600 * 24 * 7); } else if (isset($_POST['back_week'])) { $last_week_ts = strtotime($_POST['last_week']); $display_week_ts = $last_week_ts - (3600 * 24 * 7); } else { $display_week_ts = floor(time() / (3600 * 24)) * 3600 * 24; } $week_start = date('dm-Y', $display_week_ts); 

Для части, где вы просматриваете неделю, вы можете использовать что-то вроде этого:

 for ($i = 0; $i < 7; $i++) { $current_day_ts = $display_week_ts + ($i * 3600 *24); echo date('dm-Y', $current_day_ts); }