日历函数

作者: 溪水 


<?php
/**
 * 生成某年某月的日历
 * @param $weekStart int 每周第一天是周几
 * @param $linkUrl array 给日历里面的某些天添加一个a标签
 */
function generateCalendar( $month = 0, $year = 0, $weekStart = 0, $linkUrl = array() )
{
    $year = $year ? $year : date( 'Y' );
    $month = $month ? $month : date( 'm' );
    $time = mktime( 0, 0, 0, $month, 1, $year );
    $weekMap = array( 0 => 'Su', 1 => 'Mo', 2 => 'Tu', 3 => 'We',
                      4 => 'Th', 5 => 'Fr', 6 => 'Sa' );
    $weekEnd = ( $weekStart + 6 ) % 7;
    $day1week = date( 'w', $time );
    $lastDay = date( 't', $time );
    $curDay = $weekStart;

    echo '<table border=0 cellpadding=4>';
    echo '<tr>';
    echo "<th colspan='7'>{$year}年{$month}月</th>";
    echo "</tr>\n";

    // 输出星期名字
    echo '<tr>';
    for( $i = 0; $i < 7; $i ++ )
    {
        echo "<td>{$weekMap[ ( $weekStart + $i ) % 7 ]}</td>";
    }
    echo "</tr>\n";

    // 输出前导空白
    echo '<tr>';
    while( $curDay != $day1week )
    {
        echo '<td> </td>';
        $curDay = ( $curDay + 1 ) % 7;
    }

    // 输出日期
    for( $i = 1; $i <= $lastDay; $i ++ )
    {
        if( ! empty( $linkUrl[ $i ] ))
        {
            $b = "<a href='{$linkUrl[ $i ]}'>";
            $e = '</a>';
        } else
        {
            $b = '';
            $e = '';
        }
        echo "<td>$b$i$e</td>";
        if( $curDay == $weekEnd )
        {
            echo "</tr>\n<tr>";
        }
        $curDay = ( $curDay + 1 ) % 7;
    }

    // 输出后空白
    $leave = ( $weekEnd - $curDay + 8 ) % 7;
    for( $i = 0; $i < $leave; $i ++ )
    {
        echo '<td> </td>';
    }

    echo "</tr>\n";
    echo '</table>';
}

// 测试代码, 输出 2000年1月 - 2020年12月 的日期表.
for( $j = 2000; $j < 2020; $j ++ )
{
    for( $i = 1; $i <= 12; $i ++ )
    {
        echo '<div style="float: left">';
        generateCalendar($i, $j, 0, array( rand( 1, 31 ) => 'http://s.com/1', rand( 1, 31 ) => 'http://s.com/2' ) );
        echo '</div>';
    }
    echo '<div style="clear: both"></div>';
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值