基本 PHP 日历脚本的一些问题
Posted
技术标签:
【中文标题】基本 PHP 日历脚本的一些问题【英文标题】:Some issues with a basic PHP calendar script 【发布时间】:2012-03-19 15:57:25 【问题描述】:我有这个简单的 php 日历模板(从星期一开始,而不是星期日,因为我是意大利人)
<?php
$date = strtotime("2011-05-19");
$monthNames = Array("Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre");
$cMonth = date("n", $date);
$cYear = date("Y", $date);
?>
<table border="1" cellpadding="4" cellspacing="0">
<caption>
<?php echo $monthNames[$cMonth-1].' '.$cYear; ?>
</caption>
<tr>
<th>l</th>
<th>m</th>
<th>m</th>
<th>g</th>
<th>v</th>
<th>s</th>
<th>d</th>
</tr>
<?php
$timestamp = mktime(0,0,0,$cMonth,1,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate($timestamp);
$startday = $thismonth['wday']-1;
for ($i=0; $i<($maxday+$startday); $i++)
if(($i % 7) == 0 ) ?>
<tr>
<?php ?>
<?php if($i < $startday) ?>
<td> </td>
<?php else ?>
<td align='center' valign='middle' height='20px'><?php echo ($i - $startday + 1); ?></td>
<?php ?>
<?php if(($i % 7) == 6 ) ?>
</tr>
<?php ?>
<?php
?>
</table>
尽管有这个“意大利面条代码”,但它很简单而且......几乎可以工作 我只有两个问题(请更改 $date 值并自行查看):
-
如果一个月的最后一天不是一周的最后一天,则日历末尾的表格单元格会丢失
有些月份不是从 1 开始的(即尝试使用 $date = strtotime("2011-05-15");)
有什么帮助吗? 提前非常感谢
【问题讨论】:
这听起来不像是一个问题,而更像是一个未完成的实现。如果您在月初之前(例如当月不是从星期日开始)或在月底(例如当月不是在星期六结束时)缺少表格单元格,请添加它们。测试这些条件并添加适当的表格单元格。例如,许多日历会在上个月或下个月的天数中添加灰色样式,作为它们不是“当前”的视觉指示。 吉姆,如果我可以在表格的开头和结尾添加单元格,我没有写一个问题寻求帮助:我不知道如何做到这一点(而且,无论如何,似乎你读得很“过路”我的问题:我的一周从星期一开始,到星期日结束) 【参考方案1】:就个人而言,为了不重新发明***,我会使用本地化的日历插件,例如 jQuery UI Datepicker。那么用意大利语显示日历就这么简单:
$("#calendarDiv").datepicker($.datepicker.regional["it"]);
$("#calendarDiv").datepicker("setDate", "19/05/2011");
此日历(本地化为意大利语)从星期一(Lunedi)开始一周中的几天,并将默认日期格式更改为更健全的国家/地区常见的预期日/月/年。
现在,认识到使用外部插件并不总是一个可行的选择,您可以扩展 PHP 以像这样呈现您的日历(此块将出现在您当前用于周名称的标题行之后):
$timestamp = mktime(0,0,0,$cMonth,0,$cYear);
$maxday = date("t",$timestamp);
$thismonth = getdate($timestamp);
$startday = $thismonth['wday'];
for ($i = 0; $i <= ($maxday + $startday); $i++)
if(($i % 7) == 0 )
echo "<tr>";
if($i < $startday)
echo "<td> </td>";
else
echo "<td align='center' valign='middle' height='20px'>" .
($i - $startday + 1) . "</td>";
if(($i == ($maxday + $startday)) && (($i % 7) > 0))
$spareDays = (7 - ($i % 7)) - 1;
for($i = 0; $i < $spareDays; $i++)
echo "<td> </td>";
echo "</tr>";
break;
else if(($i % 7) == 6 )
echo "</tr>";
我已经对您的示例进行了一些调整,以更正开始和结束日期,以使日历视图看起来与 jQuery UI Datepicker 呈现的视图相同,但这取决于您的 PHP 实例在服务器上的本地化方式,它们可能需要重新调整(参见 dmikester1 的答案示例)。我的实现是相当基本的,但我想让它在语义上与您的原始示例保持相似。
【讨论】:
【参考方案2】:通过删除 -1 来更改这一行似乎可以解决问题 #2:
$startday = $thismonth['wday']-1;
好的,#1 的修复无效。
【讨论】:
谢谢,#1 的解决方案没问题,但它从周日开始(我需要它从周一开始); #1的解决方案不起作用:-(似乎从未达到条件 $i > $maxday+1 它从星期日开始,因为 2011 年 5 月从星期日开始。你无法改变它。以上是关于基本 PHP 日历脚本的一些问题的主要内容,如果未能解决你的问题,请参考以下文章