2

我在这里写了一个 PHP 日历生成器,http://shodor.org/~amalani/portfolio/apprenticeship/summer/phpstuff/calendar.php,它可以工作,除了 111 和 1753 之间的年份。我已经确定问题出在这一行

$first=date('w',mktime(0, 0, 0, $month, 1,$year));

它决定了该月第一天的数字表示。这将返回 -1 作为日期,因此日历函数永远不会开始新的一周。

这是所有代码

<?php
$date=getdate();


?>
<form action="calendar.php" method="POST">
    <input type='number' name='year' value=
    <?php if(isset($_POST['year'])){echo $_POST['year'];}else{echo $date['year'];}?>
    />
    <select name="month">

    <?php
        $m=1;
        for($x=60;$x<400;$x+=30){
            $month=jdmonthname($x,1);
            if(isset($_POST['month'])){
                $selected=($m==$_POST['month'])?"selected='selected'":"";
                echo $selected;
            }
            echo "
            <option value='$m' $selected>$month</option>";
            $m++;
        }
    ?>

    </select><br><br>
    <input type='submit'/>
</form>
<table border='1'>
<tr>
    <td>Sunday</td><td>Monday</td><td>Tuesday</td><td>Wednesday</td><td>Thursday</td><td>Friday</td><td>Saturday</td>
</tr>
<?php
    if(isset($_POST['month'])){
        $year=$_POST['year'];
        $month=$_POST['month'];
        $days=cal_days_in_month(CAL_GREGORIAN,$month,$year);

        //Get the numerical representation of the first day  of the month
        $first=date('w',mktime(0, 0, 0, $month, 1,$year));

        //This tabs over until the appropriate day is reached in the beginning of the month
        $week=1;
        //Output the month and year
        echo date('F',mktime(0,0,0,$month))." ".    $year." Calendar";
        //Start a new week
        echo "<tr>";

        for($x=1;$x<=$days;$x++){
            $day=date('w',mktime(0,0,0,$month,$x,$year));
            if($week==1){
                for($y=0;$y<$first;$y++){
                    echo "<td></td>";
                }
            }
            //Starts new week
            if($day==0){
                echo "</tr><tr><td>$x</td>";
            }else{
                echo "<td>$x</td>";
            }
            $week++;

        }
        echo "</tr>";

    }
?>
</table>
4

2 回答 2

2

问题在于您使用 mktime()

请注意php手册中的粗体部分

年份的数字,可以是两位或四位数的值,0-69 之间的值映射到 2000-2069 和 70-100 到 1970-2000。在 time_t 是 32 位有符号整数的系统上,正如今天最常见的那样,年份的有效范围在 1901 和 2038 之间。然而,在 PHP 5.1.0 之前,这个范围在某些系统(例如 Windows)上被限制在 1970 到 2038 之间。

您将需要消除mktime()修复此问题的需要,可能通过使用 OOP Datetime 类,但是这有其与小于 100 年相关的限制

这个答案可能会帮助您进一步了解问题

于 2013-07-16T15:12:12.987 回答
0

大多数系统(包括 mysql 和 php)都使用 unix 时间戳。这些时间戳是从 1970 年 1 月 1 日开始计数的整数值。根据整数大小(例如 32 位整数),日历的可用范围是有限的。

这解释了@Anigel 描述的范围。

于 2013-07-16T15:39:51.217 回答