博士.将周历提前一周


Php.Advance weekly calendar one week

可能重复:
在PHP 中获取下一个/上一个ISO周和年

我正在尝试写一个脚本,它将在表中显示一周中的几天,如果单击按钮,它将提前一周。我设法让它一直工作到年底,然后日期都错了。他就是我目前所拥有的。。。

 <?
     if(isset($_POST['add_week'])){
     $week = date('d-m-Y', strtotime($_POST['last_week']));
     $new_week =  strtotime ( '+1 week' , strtotime ( $week ) ) ;
     $new_week = date('d-m-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('d-m-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('d-m-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>

有些值已经被回显了,所以我可以检查正在传递的值是否正确,我知道我可能已经采取了不需要的额外步骤,但我对此相当陌生,希望在代码工作时更容易遵循。正如我所说,添加按钮在新年到来之前一直是一种享受。

感谢

好的,取得了一些进展,在2012年之前运行良好,然后再次运行到2012年,而不是从2013年开始

 <?
if(isset($_POST['add_week'])){
    $week = date('d-m-Y', strtotime($_POST['last_week']));
    $new_week =  strtotime ( '+1 week' , strtotime ( $week ) ) ;
    $new_week = date('d-m-Y', $new_week);

    $week_number = date("W", strtotime( $new_week));
    $year = date("Y", strtotime( $new_week));
}else if(isset($_POST['back_week'])){
    $week = date('d-m-Y', strtotime($_POST['last_week']));
    $new_week =  strtotime ( '-1 week' , strtotime ( $week ) ) ;
    $new_week = date('d-m-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('d-m-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('d-m-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>

在我看来,您可以更好地根据unix时间戳值进行所有计算,然后仅在需要时转换为字符串进行输出。这样,你就不必处理周数问题(即第0周),你不局限于将周一作为每周的第一天(这是date("W")中的计算基础),也不必为了寻找边缘条件而进行大量的破解。

因此,假设$_POST['last_week']是d-m-Y格式的,如下所示:

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('d-m-Y', $display_week_ts);

对于你在一周中循环显示的部分,你可以使用这样的东西:

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