2013-10-05 5 views
0

J'essaie de générer un calendrier plat d'années, de mois et de jours entre les dates. Il devrait être dans un format de table avec des années comme la première rangée le long du haut, puis les mois pour chaque année dans le format de calendrier ci-dessous. Semblable à ce que vous voyez dans un diagramme de Gantt. Je cherchais une classe php qui est relativement simple que je peux utiliser mais je ne peux pas en trouver une qui fasse exactement cela.Générer un calendrier plat des années, des mois et des jours entre deux dates

Le code le plus proche que j'ai rencontré jusqu'ici est ci-dessous, il montre un mois à la fois comment puis-je le modifier pour faire ce que je cherche?

<?php 

$date1 = new DateTime("2007-03-24"); 
$date2 = new DateTime("2009-06-26"); 
$interval = $date1->diff($date2); 

echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 

$date = strtotime("2007-03-24"); 

generateCalendar($date); 

function generateCalendar($date){ 

//This puts the day, month, and year in separate variables 
$day = date('d', $date) ; 
$month = date('m', $date) ; 
$year = date('Y', $date) ; 

//Here we generate the first day of the month 
$first_day = mktime(0,0,0,$month, 1, $year) ; 

//This gets us the month name 
$title = date('F', $first_day) ; 

//Here we find out what day of the week the first day of the month falls on 
$day_of_week = date('D', $first_day) ; 

echo $day_of_week; 

//Once we know what day of the week it falls on, we know how many blank days occure before it. If the first day of the week is a Sunday then it would be zero 

switch($day_of_week){ 

    case "Sun": $blank = 0; break; 

    case "Mon": $blank = 1; break; 

    case "Tue": $blank = 2; break; 

    case "Wed": $blank = 3; break; 

    case "Thu": $blank = 4; break; 

    case "Fri": $blank = 5; break; 

    case "Sat": $blank = 6; break; 

} 

//We then determine how many days are in the current month 

$days_in_month = cal_days_in_month(0, $month, $year) ; 

//Here we start building the table heads 

echo "<table border=1 width=294>"; 

echo "<tr><th colspan=7> $title $year </th></tr>"; 

echo "<tr><td width=42>S</td><td width=42>M</td><td 
width=42>T</td><td width=42>W</td><td width=42>T</td><td 
width=42>F</td><td width=42>S</td></tr>"; 



//This counts the days in the week, up to 7 

$day_count = 1; 



echo "<tr>"; 

//first we take care of those blank days 

while ($blank > 0) 

{ 

    echo "<td></td>"; 

    $blank = $blank-1; 

    $day_count++; 

} 

//sets the first day of the month to 1 

$day_num = 1; 



//count up the days, untill we've done all of them in the month 

while ($day_num <= $days_in_month) 

{ 

    echo "<td> $day_num </td>"; 

    $day_num++; 

    $day_count++; 



    //Make sure we start a new row every week 

    if ($day_count > 7) 

    { 

     echo "</tr><tr>"; 

     $day_count = 1; 

    } 

} 

//Finaly we finish out the table with some blank details if needed 

while ($day_count >1 && $day_count <=7) 

{ 

    echo "<td> </td>"; 

    $day_count++; 

} 


echo "</tr></table>"; 

} 
+0

ce code est Iv été tripoter où le code intervalle inutile au – user794846

+0

top doivent apparaître les jours du mois? – AlexP

+0

Pouvez-vous nous montrer la sortie voulue? –

Répondre

1

Cela va générer l'en-tête de votre table:

<? 

function daysAndDaynames($datestart, $dateend) { 
    while ($datestart <= $dateend) { 
     $dateExpl=explode("-",$datestart); 
     $dayname=date("D", strtotime($datestart)); 
     $row.="<td>" . $dateExpl[2] . "</td>"; 
     $row2.="<td>" . $dayname[0] . "</td>"; 
     $datestart=date('Y-m-d', strtotime('+1 day', strtotime($datestart))); 
    } 
    return "<tr>" . $row . "</tr><tr>" . $row2 . "</tr>"; 
} 

function months($datestart, $dateend) { 
    $dateExpl=explode("-",$datestart); 
    $curMonth=$dateExpl[1]; 
    $colspan=0; 
    $monthname=date("F", strtotime($datestart)); 
    while ($datestart <= $dateend) { 
     $dateExpl=explode("-",$datestart); 
     $monthnr=$dateExpl[1]; 
     if ($curMonth <> $monthnr) { 
      $row.="<td colspan='$colspan'> $monthname</td>"; 
      $curMonth=$monthnr; 
      $monthname=date("F", strtotime($datestart)); 
      $colspan=1; 
     } else $colspan++; 
     $datestart=date('Y-m-d', strtotime('+1 day', strtotime($datestart))); 
    } 
    $row.="<td colspan='$colspan'>$monthname</td>"; 
    return "<tr>" . $row . "</tr>"; 
} 

function years($datestart, $dateend) { 
    $dateExpl=explode("-",$datestart); 
    $curYear=$dateExpl[0]; 
    $colspan=0; 
    while ($datestart <= $dateend) { 
     $dateExpl=explode("-",$datestart); 
     $yearnr=$dateExpl[0]; 
     if ($curYear <> $yearnr) { 
      $row.="<td colspan='$colspan'> $curYear</td>"; 
      $curYear=$yearnr; 
      $colspan=1; 
     } else $colspan++; 
     $datestart=date('Y-m-d', strtotime('+1 day', strtotime($datestart))); 
    } 
    $row.="<td colspan='$colspan'>$curYear</td>"; 
    return "<tr>" . $row . "</tr>"; 
} 


$datestart='2011-11-01'; 
$dateend='2013-05-15'; 


echo "<table border='1'>"; 
$row1=years($datestart, $dateend); 
$row2=months($datestart,$dateend); 
$row3=daysAndDaynames($datestart,$dateend); 

echo $row1. $row2 . $row3; 
echo "</table>"; 
Questions connexes