Php 为什么这个日历在111年和1753年之间中断?
我在这里写了一个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
$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数据类型,就无法理解其运行或不运行的原因,那么行为是不可预测的