基本PHP日历脚本的一些问题

时间:2012-03-19 15:57:26

标签: php calendar


我有这个简单的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>&nbsp;</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. 如果该月的最后一天不是一周的最后一天,则在日历的末尾有一些缺少的表格单元格
  2. 有些月份不是从1开始(即尝试使用$ date = strtotime(“2011-05-15”);)
  3. 请帮忙吗? 非常感谢提前

2 个答案:

答案 0 :(得分: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>&nbsp;</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>&nbsp;</td>";
        echo "</tr>";
        break;
    }
    else if(($i % 7) == 6 )
        echo "</tr>";
}

我已经对您的示例进行了一些调整以更正开始日和结束日,以使日历视图看起来与jQuery UI Datepicker呈现的视图相同,但取决于您的PHP实例在服务器上的本地化方式,他们可能需要调整回来(参见dmikester1的答案)。我的实现是相当基本的,但我希望它在语义上与原始示例保持相似。

答案 1 :(得分:0)

通过删除-1更改此行似乎可以解决问题#2:

$startday = $thismonth['wday']-1;

好的,#1的修复无效。