2017-08-11 147 views
0
計數四月,直到第一個星期一明年四月週數

我努力實現以下目標:獲取其中的幾個星期開始從第一個星期一PHP

爲了報告的目的我們的週數從第一個星期一開始在四月的每個年。

我使用以下格式PHP創建日曆:

MTWTFSS

在那一個月,我想顯示的週數,從每行的結尾處1,其中的第一個星期一四月將會是第一週一直到四月(明年)的下一個第一個星期一,從那裏再次開始。

我很努力的邏輯 - 任何人都可以提出解決方案嗎?

感謝

編輯看到我下面的代碼,基本上就是我想要做的是,而不必從1月1週數,有它的第一個星期一4月:

<?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> 

部分上面的日曆(微調自己的代碼)的積分爲:https://www.phpjabbers.com/how-to-make-a-php-calendar-php26-4.html

+1

你的意思是包括你的編碼嘗試,即使它很差。發佈你的代碼證明你已經試圖自我解決,並顯示在發佈你的問題之前你已經完成了多少研究。目前看起來您正在使用SO作爲免費編碼服務。這可能會也可能不會是真實的。無論哪種方式,您的問題需要編輯。 – mickmackusa

+0

我從來沒有要求過一個代碼解決方案,我只是要求邏輯!下面的答案顯示了邏輯,所以我可以理解我很感激。 – Michael

+0

這是無關緊要的。你總是打算包括你的嘗試。我不叫你壞人。請更新您的問題。它可以是具有註釋的邏輯組件的混合半碼,也可以使用基本的PHP循環和其他實際語法。做這一步有助於人們在寫問題的同時自我解決問題 - 這減少了所有遇到的問題。當孤立的問題不能由OP解決時,志願者可以做出簡單的調整,而不是從頭開始編寫一整塊代碼。再次,不要稱你爲壞人。 – mickmackusa

回答

1

這似乎不太令人費解對我來說,與環內較少的處理。 DateInterval('P7D')只是意味着將間隔設置爲7天(1周) - 這可能是由於語法而輕微混淆的唯一部分。 DatePeriod()爲你做了所有的辛苦工作。

代碼(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>"; 

輸出(未着色):

<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> 

現在,我不想搶你的開發自己這個代碼的機會,所以我我會在這裏停下來這應該會讓您立足於完成此項目以達到您所需的規格。

+0

那裏有很好且簡單的代碼! – Michael

+0

我現在已經添加了我的部分代碼解決方案 – Michael

+0

哇,我真的不知道該phpjabber鏈接中的一些建議。如果我的回答無法解決您的問題,您能否澄清哪部分是您掛斷的。你的日曆是否互動?你有數據要插入白天的細胞嗎? – mickmackusa

1

我希望以下邏輯適合您的需求。

<?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; 
} 

它的輸出結果如下:

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

謝謝你,我想我得到了使用的邏輯jist。我只需要現在將其構建到我的日曆中,以便在每行結束時(每週)顯示週數,我將隨任何進度更新 – Michael

相關問題