我的PHP脚本用于在10月生成日历错误

时间:2013-08-05 20:14:13

标签: php calendar

我制作了一个简单的PHP脚本来生成日历。它已经过了几周(我的意思是如果月份从星期五开始,它将在那周产生它的星期一),导航等。工作得很好,但10月有一个错误。它两个月的最后一个星期日。我使用星期日作为新行的信号,所以它使

Example of my calendar

Example of calendar with October bug

这里的代码(我不专业,我自己学习PHP,没有书,只需谷歌和PHP手册):

    <?php
    function getfirstday($month, $year)
    {
        $datestr = "01-$month-$year";
        $day = date('N', strtotime($datestr));
        return $day;
    }

    function getlastday($month, $year)
    {
        $datestr = cal_days_in_month(CAL_GREGORIAN, $month, $year)."-$month-$year";
        $day = date('N', strtotime($datestr));
        return $day;
    }
    //Don't care about this, I just want to have weekdays in my primary language
    function getweekday($weekDay) {
        $list = array();
        $list['1'] = "Pondělí";
        $list['2'] = "Úterý";
        $list['3'] = "Středa";
        $list['4'] = "Čtvrtek";
        $list['5'] = "Pátek";
        $list['6'] = "Sobota";
        $list['7'] = "Neděle";
        return $list[$weekDay];
    }
    //What month and year do we want to show?
    //Ger it from URL or use current
    $month = $_GET['month'];
    if ($month == "") {
        $month = date('m');
    }
    $year = $_GET['year'];
    if ($year == "")  {
        $year = date('Y');
    }
    //Firts day of month
    $startDayStr = "01-$month-$year";
    //Some calculation to get interval of whole month and rounded weeks
    $startDay = strtotime($startDayStr) - (getfirstday($month, $year ) - 1) * 24*60*60;
    $roundMonth = 7 - getlastday($month, $year );
    $limit = cal_days_in_month(CAL_GREGORIAN, $month, $year ) + (getfirstday($month, $year ) - 1) + $roundMonth;
//Some navigation
    ?>
    <table>
        <tr>
          <?php
    if ($month > 1) {
                $prevm = $month - 1;
                $prevh = "cal.php?month=$prevm&year=$year";
            } elseif ($month == 1) {
                $prevm = 12;
                $prevy = $year -1;
                $prevh = "cal.php?month=$prevm&year=$prevy";
            }
            if ($month < 12) {
                $nextm = $month +1;
                $nexth = "cal.php?month=$nextm&year=$year";
            } elseif ($month == 12) {
              $nextm = 1;
              $nexty = $year +1;
              $nexth = "cal.php?month=$nextm&year=$nexty";
            }
            ?>
            <td width="200" align="left"><a href="<?php echo $prevh; ?>">&lt;Previous month</a></td>
            <td  width="190" align="center">
                <?php echo date('m', strtotime("01-$month-$year 00:00:00")); ?>
            </td>
            <td  width="200" align="right"><a href="<?php echo $nexth; ?>">Next month&gt;</a></td>
        </tr>
    </table>
    <?php
    //Let's generate our calendar
    echo "<table border=\"1\"><tr>";
    for($j=1;$j<=7;$j++){
        echo "<td align=\"center\" width=\"85\" height=\"50\"><b>".getweekday($j)."</b></td>";
    }
    echo "</tr><tr>";
    for($i = 1;$i <= $limit;$i++) {
        $lastDayOfMonth = strtotime(cal_days_in_month(CAL_GREGORIAN, $month, $year)."-$month-$year 23:59:59");
        $firstDayOfMonth = strtotime("01-$month-$year");
        $weekDay = date('N', $startDay);
        if ($startDay < $firstDayOfMonth || $startDay > $lastDayOfMonth) {
            $class = "caltdb";
        } else {
            $class = "caltda";
        }
        echo "<td class=\"$class\" align=\"center\" height=\"40\">". date('d', $startDay) ."</td>";


        if ($weekDay == '7') {
            echo "</tr><tr>";
        }
        $startDay = $startDay + 24*60*60;
    }
    echo "</tr></table>";
    ?>

你能帮我解决这个问题吗?我不知道为什么会这样。

非常感谢, Heretiiik

1 个答案:

答案 0 :(得分:3)

问题可能是因为您使用+ 24*60*60将一天添加到时间戳。这会导致夏令时出现问题,因为DST开始/结束时有23或25小时。

在脚本末尾附近,替换:

$startDay = $startDay + 24*60*60;

使用:

$startDay = strtotime('+1 day', $startDay);