基本 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>&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 开始的(即尝试使用 $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>&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 的答案示例)。我的实现是相当基本的,但我想让它在语义上与您的原始示例保持相似。

【讨论】:

【参考方案2】:

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

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

好的,#1 的修复无效。

【讨论】:

谢谢,#1 的解决方案没问题,但它从周日开始(我需要它从周一开始); #1的解决方案不起作用:-(似乎从未达到条件 $i > $maxday+1 它从星期日开始,因为 2011 年 5 月从星期日开始。你无法改变它。

以上是关于基本 PHP 日历脚本的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

在脚本和一些 PHP 服务器(如脚本)之间共享变量(数组)

用于全日历的 JSON 的 PHP 脚本

使用 PhP 执行一些 python 脚本不起作用

阻止谷歌脚本复制从工作表转移到日历的事件

Java 中Calendar日历类的基本使用

基本的 PHP 语法在服务器上执行脚本