2017-08-11 3 views
0

Ich versuche folgendes zu erreichen:Wochen erhöhen Sie die Chance, wo die Wochen vom ersten Montag im April bis zum ersten Montag im April nächstes Jahr in PHP anfangen zu zählen

Für Berichtszwecke unserer Woche Zahlen aus dem ersten Montag im April beginnen jeweils Jahr.

Ich schaffe einen Kalender PHP in folgendem Format:

MTWTFSS

Am Ende jeder Zeile des Monats möchte ich die Woche Nummer anzuzeigen, beginnend bei 1, wo der erste Montag im Der April wird Woche eins bis zum nächsten ersten Montag im April (nächstes Jahr) sein, wo es wieder von einem beginnt.

Ich kämpfe mit der Logik - kann jemand eine Lösung vorschlagen? stattdessen zu tun ist 01 die Woche Zahl von Januar zu haben, hat sie vom ersten Montag im April

Dank

EDIT siehe meinen Code unten, im Grunde, was ich versuche:

<?php 
$monthNames = Array("January", "February", "March", "April", "May",  "June", "July", 
"August", "September", "October", "November", "December"); 
?> 

<?php 
if (!isset($_REQUEST["month"])) $_REQUEST["month"] = date("n"); 
if (!isset($_REQUEST["year"])) $_REQUEST["year"] = date("Y"); 
?> 

<?php 
$cMonth = $_REQUEST["month"]; 
$cYear = $_REQUEST["year"]; 

$prev_year = $cYear; 
$next_year = $cYear; 
$prev_month = $cMonth-1; 
$next_month = $cMonth+1; 

if ($prev_month == 0) { 
    $prev_month = 12; 
    $prev_year = $cYear - 1; 
} 
if ($next_month == 13) { 
    $next_month = 1; 
    $next_year = $cYear + 1; 
} 
?> 

<table width="250"> 
<tr align="center"> 
<td bgcolor="#999999" style="color:#FFFFFF"> 
<table width="100%" border="0" cellspacing="0" cellpadding="0"> 
<tr> 
<td width="50%" align="left"> <a href="<?php echo $_SERVER["PHP_SELF"] . "?month=". $prev_month . "&year=" . $prev_year; ?>" style="color:#FFFFFF">Previous</a></td> 
<td width="50%" align="right"><a href="<?php echo $_SERVER["PHP_SELF"] . "?month=". $next_month . "&year=" . $next_year; ?>" style="color:#FFFFFF">Next</a> </td> 
</tr> 
</table> 
</td> 
</tr> 
<tr> 
<td align="center"> 
<table width="100%" border="0" cellpadding="2" cellspacing="2"> 
<tr align="center"> 
<td colspan="8" bgcolor="#999999" style="color:#FFFFFF"><strong><?php echo $monthNames[$cMonth-1].' '.$cYear; ?></strong></td> 
</tr> 
<tr> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>M</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>W</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>T</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>F</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>S</strong></td> 
<td align="center" bgcolor="#999999" style="color:#FFFFFF"><strong>Week No</strong></td> 
</tr> 


<?php 
$timestamp = mktime(0,0,0,$cMonth,1,$cYear); 
$maxday = date("t",$timestamp); 
$thismonth = getdate ($timestamp); 
//$startday = $thismonth['wday']; 
$startday = $thismonth['wday']-1; 

$firstDateMonth = 0; 

function roundToNearestW($int, $i) { 
    return ceil($int/$i) * $i; 
} 

if ($startday == -1) 
{ 
    $startday = 6; 
} 
$complete_cells = roundToNearestW($maxday+$startday,7); 
for ($i=0; $i<($complete_cells); $i++) { 
    if(($i % 7) == 0) 
    { 
     echo "<tr> 
     "; 
    } 
    if($i < $startday || $i >= $maxday+$startday) 
    { 
     echo "<td></td> 
     "; 
    } 
    else 
    { 
     if(($i - $startday + 1) > $firstDateMonth) 
     { 
      $firstDateMonth = ($i - $startday + 1); 
     } 
     echo "<td align='center' valign='middle' height='20px'>". ($i - $startday + 1) . "</td> 
     "; 
    } 
    if(($i % 7) == 6) 
    { 
     $weekDate = $cYear."-".$cMonth."-".$firstDateMonth; 
     $Caldate = new DateTime($weekDate); 
     $week = $Caldate->format("W"); 
     echo "<td align='center' valign='middle' height='20px'>WK ".$week."</td> 
     "; 
    } 
    if(($i % 7) == 6) 
    { 
     echo "</tr>"; 
     //firstDateMonth = 0; 
    } 

} 
?> 



</table> 
</td> 
</tr> 
</table> 

Teil Kredit für oben genannten Kalender (Code etwas angeglichen) an: https://www.phpjabbers.com/how-to-make-a-php-calendar-php26-4.html

+1

Sie sollten Ihren Codierungsversuch einschließen, auch wenn er sehr schlecht ist. Wenn du deinen Code veröffentlichst, beweist das, dass du versucht hast, dich selbst zu lösen und zeigst, wie viel Forschung du getan hast, bevor du deine Frage gepostet hast. Derzeit scheint es, dass Sie SO als einen kostenlosen Codierungsdienst verwenden. Dies kann oder kann nicht wahr sein. In jedem Fall muss Ihre Frage bearbeitet werden. – mickmackusa

+0

Ich habe nie nach einer Codelösung gefragt, ich habe nur nach der Logik gefragt! Die folgende Antwort zeigt die Logik, so dass ich verstehen kann, wofür ich dankbar bin. – Michael

+0

Das ist irrelevant. Sie sollen immer Ihren Versuch einschließen. Ich nenne dich nicht schlecht. Bitte aktualisieren Sie Ihre Frage. Es kann gemischter Semi-Code sein, der Kommentare enthält, wo Logikkomponenten sind, aber auch grundlegende PHP-Schleifen und andere tatsächliche Syntax verwendet. Dieser Schritt hilft den Menschen, sich selbst zu lösen, während sie ihre Frage schreiben - was die gesamten Fragen, die SO betreffen, reduziert. Wenn die isolierten Probleme nicht vom OP behoben werden können, können Freiwillige einfache Anpassungen vornehmen, anstatt einen vollständigen Code-Block von Grund auf neu zu schreiben. Nochmals, ich nenne dich keine schlechte Person. – mickmackusa

Antwort

1

Dies scheint weniger gewunden mir, mit weniger Verarbeitung in der Schleife. bedeutet nur, dass das Intervall auf 7 Tage (1 Woche) eingestellt wird - dies kann der einzige Teil sein, der aufgrund der Syntax leicht verwirrend ist. DatePeriod() macht all die harte Arbeit für Sie.

-Code (Demo)

$year=2018; // $_GET['year']; 
$next=$year+1; 
$start=new DateTime(date('Y-m-d', strtotime("first Monday of April $year"))); 
$stop=new DateTime(date('Y-m-d', strtotime("first Monday of April $next"))); 
// there is a known behavior of DatePeriod to stop before $stop (...not contain it) 
// See http://au2.php.net/manual/en/class.dateperiod.php for explanations & workarounds 
$range=new DatePeriod($start,new DateInterval('P7D'),$stop); 
echo "<table>"; 
    echo "<tr>"; 
     echo "<th colspan=\"8\">Financial Calendar $year-$next</th>"; 
    echo "</tr>"; 
    echo "<tr>"; 
     echo "<th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th><th>#</th>"; 
    echo "</tr>"; 
    foreach ($range as $i=>$date) { 
     echo "<tr>"; 
      echo "<td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>",++$i,"(",$date->format("Y-m-d"),")</td>"; 
     echo "</tr>"; 
    } 
echo "</table>"; 

Ausgang (unrendered):

<table> 
    <tr> 
     <th colspan="8">Financial Calendar 2018-2019</th> 
    </tr> 
    <tr> 
     <th>M</th><th>T</th><th>W</th><th>T</th><th>F</th><th>S</th><th>S</th><th>#</th> 
    </tr> 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>1(2018-04-02)</td> 
    </tr> 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>2(2018-04-09)</td> 
    </tr> 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>3(2018-04-16)</td> 
    </tr> 
    ... 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>50(2019-03-11)</td> 
    </tr> 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>51(2019-03-18)</td> 
    </tr> 
    <tr> 
     <td></td><td></td><td></td><td></td><td></td><td></td><td></td><td>52(2019-03-25)</td> 
    </tr> 
</table> 

Nun, ich will nicht zu berauben Sie die Gelegenheit, diesen Code für sich selbst zu entwickeln, so dass ich Ich werde hier aufhören. Dies sollte Ihnen einen Halt geben, um dieses Projekt zu Ihrer gewünschten Spezifikation zu beenden.

+0

Netter und einfacher Code da! – Michael

+0

Ich habe jetzt meine teilweise Code-Lösung hinzugefügt – Michael

+0

Wow, ich bin wirklich unbeeindruckt von einigen der Ratschläge in diesem phpjabber-Link. Wenn meine Antwort Ihr Problem nicht löst, können Sie klären, welchen Teil Sie aufgehängt haben. Ist Ihr Kalender interaktiv? Haben Sie Daten in die Tageszellen einzufügen? – mickmackusa

1

Ich hoffe, dass die folgende Logik Ihren Bedürfnissen entspricht.

<?php 

$begin = new DateTime(date('Y-m-d', strtotime('first Monday of April this year'))); 
$end  = new DateTime(date('Y-m-d', strtotime('last Monday of March next year'))); 
$interval = DateInterval::createFromDateString('1 week'); 

$weekNumberOfFirstMondayInApril = $begin->format('W'); 

foreach (new DatePeriod($begin, $interval, $end) as $dt) { 
    $phpWeekNum = $dt->format('W'); 

    $isFirstQuarter = ($phpWeekNum < $weekNumberOfFirstMondayInApril); 

    $businessWeekNum = $isFirstQuarter 
     ? ($phpWeekNum + (52 - $weekNumberOfFirstMondayInApril)) 
     : ($phpWeekNum - $weekNumberOfFirstMondayInApril) ; 

    echo 'Date: ' . $dt->format('l, Y-m-d') . PHP_EOL; 
    echo 'PHP week number: ' . $phpWeekNum . PHP_EOL; 
    echo 'Business week number: ' . ($businessWeekNum + 1) . PHP_EOL; 
    echo PHP_EOL; 
} 

Es ist Ausgabe lautet wie folgt:

Date: Monday, 2017-04-03 
PHP week number: 14 
Business week number: 1 

    <snip> 

Date: Monday, 2017-12-25 
PHP week number: 52 
Business week number: 39 

Date: Monday, 2018-01-01 
PHP week number: 01 
Business week number: 40 

    <snip> 

Date: Monday, 2018-03-26 
PHP week number: 13 
Business week number: 52 
+0

Danke dafür, ich denke, ich bekomme die Logik der Logik. Ich muss das jetzt einfach in meinen Kalender einbauen, damit am Ende jeder Zeile (jede Woche) die Wochennummer angezeigt wird, ich werde mit jedem Fortschritt updaten – Michael

Verwandte Themen