2015-04-13 3 views
1

Я хочу запрограммировать автоматический календарь на 1 год.
Моя цель - распечатать часть календаря каждый месяц.Что случилось с моим кодом PHP-Calendar?

У меня есть проблемы с января 2016 года, данные не будут отображаться на столе. Что здесь не так?

function deutscherWochentag($zeitstempel) { 
    $wochentag = date("w", $zeitstempel); 
    switch ($wochentag) { 
     case 0:  return 6; break; 
     case 1:  return 0; break; 
     case 2:  return 1; break; 
     case 3:  return 2; break; 
     case 4:  return 3; break; 
     case 5:  return 4; break; 
     case 6:  return 5; break; 
    } 
} 

$monatsNamen= array("Januar", "Februar", "März", "April", "Mai", 
    "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"); 
$table = "<table style=\"border: 1px solid black; border-spacing; 0px; 
    border-collapse: collapse;\"> 
    <tr style=\"background-color: moccasin;\"> 
     <th colspan=\"7\">%s</th> 
    </tr> 
    <tr style=\"background-color: lightgray;\"> 
     <th>Mo</th> 
     <th>Di</th> 
     <th>Mi</th> 
     <th>Do</th> 
     <th>Fr</th> 
     <th>Sa</th> 
     <th>So</th> 
    </tr> 
    %s  
</table>"; 
$tr = "<tr> 
    %s 
</tr>"; 
$td = "<td style=\"padding: 5px; border: 1px solid black;\">%s</td>"; 

for ($monat = 0; $monat < 12; $monat++) { 
    $ersterZeitstempel = strtotime("first day of +".$monat." months"); 
    $zeitstempel = $ersterZeitstempel; 
    $letzterZeitstempel = strtotime("last day of +".$monat." months"); 

    $ersterWochentag = deutscherWochentag($ersterZeitstempel); 
    $letzterWochentag = deutscherWochentag($letzterZeitstempel); 

    $ersteKW = date("W", $ersterZeitstempel); 
    $letzteKW = date("W", $letzterZeitstempel); 
    $anzahlWochen = $letzteKW - $ersteKW + 1; 

    $datenWoche = ""; 
    for ($woche = 0; $woche < $anzahlWochen; $woche++) { 

     $datenTag = ""; 
     for ($tag = 0; $tag < 7; $tag++) { 

      if ($woche == 0 && $tag < $ersterWochentag) { 
       $datenTag .= sprintf($td, "&nbsp;"); 
      } else if ($woche == 0 && $tag >= $ersterWochentag  || 
         $woche > 0 && $woche < $anzahlWochen - 1 || 
         $woche == $anzahlWochen - 1 && $tag <= $letzterWochentag) { 
       echo date("d.m.Y", $zeitstempel)."<br />"; 
       $datum = date("d", $zeitstempel); 
       $datenTag .= sprintf($td, $datum); 
       $zeitstempel = strtotime("+1 day", $zeitstempel); 
      } else if ($woche == $anzahlWochen - 1 && $tag > $letzterWochentag) { 
       $datenTag .= sprintf($td, "&nbsp;"); 
      } 
     } 

     $datenWoche .= sprintf($tr, $datenTag); 
    } 

    $monatsZahl = date("n", $ersterZeitstempel) - 1; 
    $monatsTitel = $monatsNamen[$monatsZahl]." ".date("Y", $ersterZeitstempel); 

    echo "<br />".sprintf($table, $monatsTitel, $datenWoche)."<br />"; 
} 

Большое спасибо за вашу помощь заранее.

ответ

1

Я сам решил проблему.

Проблема была календарной неделей. В январе календарная неделя будет прыгать от 52/53 (зависит от високосного года) 1.

Я просто установить переменную $anzahlWochen в коде выше
от значения $letzteKW - $ersteKW + 1;
в ($ersteKW < $letzteKW ? $letzteKW - $ersteKW + 1 : $letzteKW + 1);

Затем, наконец, появится месяц Январь 2016 года и правильно напечатает значения.

Смежные вопросы