Php 为什么这个日历在111年和1753年之间中断?

Php 为什么这个日历在111年和1753年之间中断?,php,date,Php,Date,我在这里写了一个PHP日历生成器,它可以工作,除了111年到1753年之间的年份。我已经确定问题出在这方面 $first=date('w',mktime(0, 0, 0, $month, 1,$year)); 它确定月份第一天的数字表示形式。这将为日期返回-1,因此日历函数永远不会开始新的一周 这是所有的代码 <?php $date=getdate(); ?> <form action="calendar.php" method="POST"> <in

我在这里写了一个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>

问题在于您对mktime()的使用

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

年份的数字,可以是两位数或四位数, 0-69之间的值映射到2000-2069,70-100映射到1970-2000。在…上 时间是32位有符号整数的系统,这是当今最常见的系统, 年的有效范围介于1901年和2038年之间。然而, 在PHP5.1.0之前,在某些情况下,该范围从1970年限制到2038年 系统(如Windows)

您需要删除
mktime()
来修复此问题,可能需要使用OOP。但是,这有其自身的限制,与100年以下有关

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

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


这就解释了@Anigel.

所描述的范围。不要尝试使用1753年之前的年份,因为在这之前,不同的地方对日历的概念完全不同。@IgnacioVazquez Abrams但是为什么它不起作用呢?因为我刚刚在你提到的范围内尝试了一年,使用了你确定是问题的那一行,但我没有得到有效的日期。这可能取决于时区设置,也可能取决于PHP版本。MySQL的内部时间戳是一个32位带符号的整数。除非升级到64位时间戳的64位版本,否则不能表示1901年ish之前或2038年ish之后的日期。@MarcB OP在任何地方都不使用MySQL,但是否使用它?你可能会有一个数字作为日期返回,但由于公历直到1582年才出现,或者是任何时候,谁能说109年的某个日期是星期二呢?在范围或有效年份之外,如果不了解php内部结构和c数据类型,就无法理解其运行或不运行的原因,那么行为是不可预测的