0

これが私の問題です。すべての月が1日目から始まりますが、2012年7月目は2日目から始まります。理由はわかりません。

これがコードです

<table>
<?php
$cMonth = 7;
$cYear = 2012;

$first_day_timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday              = date("t",$first_day_timestamp);
$thismonth           = getdate($first_day_timestamp);
$startday            = $thismonth['wday'] - 1;

for ($i=0; $i<($maxday+$startday); $i++) {

    if (($i % 7) == 0 )  echo "<tr>";

    if ($i < $startday) { echo "<td>&nbsp;</td>" ; continue; }

    $current_day = $i - $startday + 1;

    echo "<td>". $current_day . "</td>";

    if (($i % 7) == 6 ) echo "</tr>";
}
?>
</table>

添付画像

カレンダー

なぜこれが起こったのか教えてください

4

2 に答える 2

2

に変更$startday = $thismonth['wday'] - 1;する$startday = $thismonth['wday'];と、日曜日が週の最初の日である適切なカレンダーが表示されます。

コードの問題は、$ startdayが-1であるということです(月が日曜日に始まるため、$ thismonth ['wday']は0です)。ループの最初の反復では、$current_day = 0 - (-1) + 1 = 2月曜日が月の2日であるため、2から始まります。これは正しいです。

この問題は、日曜日から始まるすべての月に発生します。2013年9月をお試しください。

于 2012-06-01T18:15:44.803 に答える
1

なぜあなたはこれをやっている:

$startday            = $thismonth['wday'] - 1;

??

日オフセットを1つ戻します。これは事実上、あなたが頼りにしたい日がその月の最初の日の前日であると言っています。

--EDIT--つまり、カレンダーを日曜日ではなく月曜日に開始する必要があるためです。phpのwdayはこれです:

0(日曜日)から6(土曜日)

そこから1を引くと、月が日曜日に始まるまで、月の始まりが1日下にシフトします。その場合、$ startdayは-1になり、カウントが破棄されます。代わりに、前の週にラップアラウンドする必要があります。このケースを修正する別の行を追加すると、次のようになります。

$startday = thismonth['wday'] - 1;
if($startday < 0 ) $startday = 6;

問題が解決するはずです。ただし、月曜日が週の最初の日であることを補う方法は他にもあると思います。

于 2012-06-01T18:15:54.497 に答える