从自定义自定义日期显示日历

时间:2016-07-07 05:54:48

标签: php calendar

Hii我正在开设门户网站,需要自定义日期的日历,例如7月14日至8月14日。我已经做了一个正确开始的演示,即7月14日从星期四开始,但不会在8月14日星期日结束。看看我做了什么

function getCalender($year = '',$month = '')
{
    $startDate = "2016-07-03";
    $endDate = "2016-07-31";
    $dateYear = ($year != '')?$year:date("Y");
    $dateMonth = ($month != '')?$month:date("m");
    $date = $dateYear.'-'.$dateMonth.'-01';
    $currentMonthFirstDay = date("N",strtotime($date));
    $startDateFrom = date("N",strtotime($startDate));
    $endDateFrom = date("N",strtotime($endDate));
    $timestamp = strtotime($startDate);
    $dayCount = date("d", $timestamp);
    $timestamp1 = strtotime($endDate);
    $dayCountend = date("d", $timestamp1);

    $totalDaysOfMonth = cal_days_in_month(CAL_GREGORIAN,$dateMonth,$dateYear);
    $totalDaysOfMonthDisplay = ($currentMonthFirstDay == 7)?($totalDaysOfMonth):($totalDaysOfMonth + $currentMonthFirstDay);
    //$boxDisplay = ($totalDaysOfMonthDisplay <= 35)?35:42;
    //$boxDisplay = 29

?>


    <div id="calender_section">
            <h2>
                <!--<a href="javascript:void(0);" onclick="getCalendar('calendar_div','<?php echo date("Y",strtotime($date.' - 1 Month')); ?>','<?php echo date("m",strtotime($date.' - 1 Month')); ?>');">&lt;&lt;</a>-->
                <select name="month_dropdown" class="month_dropdown dropdown"><?php echo getAllMonths($dateMonth); ?></select>
                <select name="year_dropdown" class="year_dropdown dropdown"><?php echo getYearList($dateYear); ?></select>
                <!--<a href="javascript:void(0);" onclick="getCalendar('calendar_div','<?php echo date("Y",strtotime($date.' + 1 Month')); ?>','<?php echo date("m",strtotime($date.' + 1 Month')); ?>');">&gt;&gt;</a>-->
            </h2>
            <div id="event_list" class="none"></div>
            <!--For Add Event-->
            <div id="event_add" class="none">
                <p>Add Event on <span id="eventDateView"></span></p>
                <p><b>Event Title: </b><input type="text" id="eventTitle" value=""/></p>
                <input type="hidden" id="eventDate" value=""/>
                <input type="button" id="addEventBtn" value="Add"/>
            </div>
            <div id="calender_section_top">
                <ul>
                    <li>Mon</li>
                    <li>Tue</li>
                    <li>Wed</li>
                    <li>Thu</li>
                    <li>Fri</li>
                    <li>Sat</li>
                    <li>Sun</li>
                </ul>
            </div>
            <div id="calender_section_bot">
                <ul>
                <?php 

                    for($cb=1;$cb<=$dayCountend;$cb++){
                        //echo $cb;
                        if(($cb >= $startDateFrom) && $cb<=$dayCountend)
                        {
                        /*if(($cb >= $currentMonthFirstDay+1 || $currentMonthFirstDay == 7) && $cb <= ($totalDaysOfMonthDisplay)){*/
                            //Current date
                            $currentDate = $dateYear.'-'.$dateMonth.'-'.$dayCount;
                            $currentdate = date("D M j",strtotime($currentDate));
                            $eventNum = 0;
                            //Include db configuration file
                            include 'dbConfig.php';
                            //Get number of events based on the current date
                            $result = $db->query("SELECT title FROM events WHERE date = '".$currentDate."' AND status = 1");
                            $eventNum = $result->num_rows;
                            //Define date cell color
                            if(strtotime($currentDate) == strtotime(date("Y-m-d"))){
                                echo '<li date="'.$currentDate.'" class="grey date_cell">';
                            }elseif($eventNum > 0){
                                echo '<li date="'.$currentDate.'" class="light_sky date_cell">';
                            }else{
                                echo '<li date="'.$currentDate.'" class="date_cell">';
                            }

                            //Date cell
                            echo '<span>';
                            echo $cb;
                            echo '</span>';

                            //Hover event popup
                            /*echo '<div id="date_popup_'.$currentDate.'" class="date_popup_wrap none">';
                            echo '<div class="date_window">';
                            echo '<div class="popup_event">Events ('.$eventNum.')</div>';
                            echo ($eventNum > 0)?'<a href="javascript:;" onclick="getEvents(\''.$currentDate.'\');">view events</a><br/>':'';
                            //For Add Event
                            echo '<a href="javascript:;" onclick="addEvent(\''.$currentDate.'\');">add event</a>';
                            echo '</div></div>';

                            echo '</li>';*/
                            $dayCount++;
                ?>
                <?php }else{ ?>
                    <li><span>&nbsp;</span></li>
                <?php } } ?>
                </ul>
            </div>
        </div>


    <?php
    }
    ?>

2 个答案:

答案 0 :(得分:1)

我尝试了你的代码,我找到了一个逻辑,我从用户那里获取了开始日期和结束日期,并创建了两个日期之间的日期数组。 那么日历应该从前面开始。 2016年7月3日,我插入的那天是星期日 - 直到第一次约会。检查下面我做了什么

function getCalender($year = '',$month = '',$startDate = '',$endDate = '')
{
$finalArray = array();
    $startDate = "2016-07-03";
    $endDate = "2016-08-31";
    $date1 = createDateRangeArray('2016-07-03 ','2016-08-31');

    //$date = $dateYear.'-'.$dateMonth.'-01';

    $startDateFrom = date("N",strtotime($startDate));
    $endDateFrom = date("N",strtotime($endDate));

    //Take the day from the date
    $timestamp = strtotime($startDate);
    $dayCount = date("d", $timestamp);

    //Take the month from the date
    $timestampend = strtotime($endDate);
    $dayCountend = date("d", $timestampend);

    //Take the month from the date
    $timestampmonth = strtotime($startDate);
    $monthstart = date("m", $timestampmonth);

    //Take the month from the date
    $timestampmonthend = strtotime($endDate);
    $monthend = date("m", $timestampmonthend);

    //Take the year from the start date
    $yearstart = strtotime($startDate);
    $yearofStart = date("y", $yearstart);

    //Take the year from the end date
    $yearend = strtotime($endDate);
    $yearofEnd = date("y", $yearend); 

    //cal difference between start date and month
    $differenceStartDate = $dayCount - 1;

    //cal difference between end date and month
    $totalDaysOfMonthEnd = cal_days_in_month(CAL_GREGORIAN,$monthend,$yearofEnd);
    $totalDaysOfMonthStart = cal_days_in_month(CAL_GREGORIAN,$monthstart,$yearofEnd);

    if($monthstart == $monthend)
    {
        echo "Show one month calendar";
    }
    else
    {
        $diffmonth = $monthend-$monthstart;
    }

    $differenceStartDate = $dayCountend - $totalDaysOfMonth;


    for($i=1;$i<$startDateFrom;$i++)
    {
        $date[] = '-';
    }
    array_push($date,$date1);

    for($j=0;$j<count($date);$j++)
    {
        if(strlen($date[$j])==1)
        {
            array_push($finalArray,$date[$j]);
        }
        else
        {
            for($k=0;$k<count($date[$j]);$k++)
            {
                array_push($finalArray,$date[$j][$k]);
            }
        }
    }
    print_r($finalArray);



    $timestamp1 = strtotime($endDate);
    $dayCountend = date("d", $timestamp1);

    $now = strtotime($startDate);
    $your_date = strtotime($endDate);
    $datediff = $your_date - $now;
    $diff= floor($datediff/(60*60*24)); 

    $totalDaysOfMonth = cal_days_in_month(CAL_GREGORIAN,$dateMonth,$dateYear);
    $totalDaysOfMonthDisplay = ($currentMonthFirstDay == 7)?($totalDaysOfMonth):($totalDaysOfMonth + $currentMonthFirstDay);
    //$boxDisplay = ($totalDaysOfMonthDisplay <= 35)?35:42;
    $boxDisplay = $diff;

?>
    <div id="calender_section">
        <h2>
            <!--<a href="javascript:void(0);" onclick="getCalendar('calendar_div','<?php echo date("Y",strtotime($date.' - 1 Month')); ?>','<?php echo date("m",strtotime($date.' - 1 Month')); ?>');">&lt;&lt;</a>-->
           <!-- <select name="month_dropdown" class="month_dropdown dropdown"><?php echo getAllMonths($dateMonth); ?></select>
            <select name="year_dropdown" class="year_dropdown dropdown"><?php echo getYearList($dateYear); ?></select>-->
            <!--<a href="javascript:void(0);" onclick="getCalendar('calendar_div','<?php echo date("Y",strtotime($date.' + 1 Month')); ?>','<?php echo date("m",strtotime($date.' + 1 Month')); ?>');">&gt;&gt;</a>-->
        </h2>
        <div id="event_list" class="none"></div>
        <!--For Add Event-->
        <div id="event_add" class="none">
            <p>Add Event on <span id="eventDateView"></span></p>
            <p><b>Event Title: </b><input type="text" id="eventTitle" value=""/></p>
            <input type="hidden" id="eventDate" value=""/>
            <input type="button" id="addEventBtn" value="Add"/>
        </div>
        <div id="calender_section_top">
            <ul>
                <li>Mon</li>
                <li>Tue</li>
                <li>Wed</li>
                <li>Thu</li>
                <li>Fri</li>
                <li>Sat</li>
                <li>Sun</li>
            </ul>
        </div>
        <div id="calender_section_bot">
            <ul>
            <?php 

                for($cb=0;$cb<count($finalArray);$cb++)
                {
                    //echo $cb;
                    $date = $finalArray[$cb];
                    $month = strtotime($date);
                    $month = date("m", $month);


                    if(($cb >= $startDateFrom -1))
                    {
                    /*if(($cb >= $currentMonthFirstDay+1 || $currentMonthFirstDay == 7) && $cb <= ($totalDaysOfMonthDisplay)){*/
                        //Current date
                        $currentDate = $finalArray[$cb];
                        //$currentdate = date("D M j",strtotime($currentDate));
                        $eventNum = 0;

                        //Include db configuration file
                        //Define date cell color
                        if(strtotime($currentDate) == strtotime(date("Y-m-d"))){
                            echo '<li date="'.$currentDate.'" class="grey date_cell">';
                            echo '<select name="select"></select>
                                 <option value="0"></option>';
                        }elseif($eventNum > 0){
                            echo '<li date="'.$currentDate.'" class="light_sky date_cell">';
                            echo '<select name="select"></select>
                                 <option value="0"></option>';
                        }else{
                            echo '<li date="'.$currentDate.'" class="date_cell">';
                            echo '<select name="select"></select>
                                 <option value="0"></option>';
                        }

                        //Date cell
                        echo '<span>';
                        echo $currentDate;
                        echo '</span>';
                        $dayCount++;
            ?>
            <?php }else{ ?>
                <li><span>&nbsp;</span></li>
            <?php } } ?>
            </ul>
        </div>
    </div>
<?php
}
function createDateRangeArray($strDateFrom,$strDateTo)
{
    // takes two dates formatted as YYYY-MM-DD and creates an
    // inclusive array of the dates between the from and to dates.

    // could test validity of dates here but I'm already doing
    // that in the main script

    $aryRange=array();

    $iDateFrom=mktime(1,0,0,substr($strDateFrom,5,2),     substr($strDateFrom,8,2),substr($strDateFrom,0,4));
    $iDateTo=mktime(1,0,0,substr($strDateTo,5,2),     substr($strDateTo,8,2),substr($strDateTo,0,4));

    if ($iDateTo>=$iDateFrom)
    {
        array_push($aryRange,date('Y-m-d',$iDateFrom)); // first entry
        while ($iDateFrom<$iDateTo)
        {
            $iDateFrom+=86400; // add 24 hours
            array_push($aryRange,date('Y-m-d',$iDateFrom));
        }
    }
    return $aryRange;
}

?>

看看代码,您就会很容易理解

答案 1 :(得分:1)

@BeDeveloper给出的答案很好。我做了类似下面的事情,自动禁用ex.if date 3的所有其他日期,它将禁用1和2

<style>
    /* calendar */
    h1 { font-family: calibri; font-size: 20px; color: #6d6d6d}
table.calendar        { border-left:1px solid #999; }
tr.calendar-row    {  }
td.calendar-day    { min-height:80px; font-size:11px; position:relative; } * html div.calendar-day { height:80px; }
td.calendar-day:hover    { background:#eceff5; }
td.calendar-day-np    { background:#eee; min-height:80px; } * html div.calendar-day-np { height:80px; }
td.calendar-day-head { background:#ccc; font-weight:bold; text-align:center; width:120px; padding:5px; border-bottom:1px solid #999; border-top:1px solid #999; border-right:1px solid #999; }
div.day-number        { background:#999; padding:5px; color:#fff; font-weight:bold; float:right; margin:-5px -5px 0 0; width:20px; text-align:center; }
/* shared */
td.calendar-day, td.calendar-day-np { width:120px; padding:5px; border-bottom:1px solid #999; border-right:1px solid #999; }
</style>

<?php
/* draws a calendar */
function draw_calendar($month,$year,$startDate,$endDate){

         $startDate = date('Y-m-d',$startDate);
         $endDate = date('Y-m-d',$endDate);

         $timestamp = strtotime($startDate);
         $dayCountstart = date("d", $timestamp);

         $timestamp = strtotime($endDate);
         $dayCountend = date("d", $timestamp);

         $timestampmonth = strtotime($startDate);
         $monthstart = date("m", $timestampmonth);

         $timestampmonthend = strtotime($endDate);
         $monthend = date("m", $timestampmonthend);

         $yearend = strtotime($endDate);
         $yearofEnd = date("y", $yearend); 

         $dayMinus = $dayCountstart - 01;
         $totalDaysOfMonthEnd = cal_days_in_month(CAL_GREGORIAN,$monthend,$yearofEnd);
         $dayEndMinus = $totalDaysOfMonthEnd - $dayCountend;

    /* draw table */
    $calendar = '<table cellpadding="0" cellspacing="0" class="calendar">';

    /* table headings */
    $headings = array('Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday');
    $calendar.= '<tr class="calendar-row"><td class="calendar-day-head">'.implode('</td><td class="calendar-day-head">',$headings).'</td></tr>';

    /* days and weeks vars now ... */
    $running_day = date('w',mktime(0,0,0,$month,1,$year));
    $days_in_month = date('t',mktime(0,0,0,$month,1,$year));
    $days_in_this_week = 1;
    $day_counter = 0;
    $dates_array = array();

    /* row for week one */
    $calendar.= '<tr class="calendar-row">';

    /* print "blank" days until the first of the current week */
    for($x = 0; $x < $running_day; $x++):
        $calendar.= '<td class="calendar-day-np"> </td>';
        $days_in_this_week++;
    endfor;

    /* keep going with days.... */
    for($list_day = 1; $list_day <= $days_in_month; $list_day++):
        $calendar.= '<td class="calendar-day">';
            /* add in the day number */
            if($monthstart == $month)
            {
                if($list_day <= $dayMinus)
                {
                    $calendar.= '<div class="day-number123">'.$list_day.'</div>';
                }
                else
                {
                    $calendar.= '<div class="day-number">'.$list_day.'</div>';
                }
            }
            else 
            {
                if($monthend == $month)
                {
                    if($list_day <= $dayCountend)
                    {
                        $calendar.= '<div class="day-number">'.$list_day.'</div>';
                    }
                    else
                    {
                        $calendar.= '<div class="day-number123">'.$list_day.'</div>';
                    }
                }
                else
                {
                    $calendar.= '<div class="day-number">'.$list_day.'</div>';
                }
            }

            /** QUERY THE DATABASE FOR AN ENTRY FOR THIS DAY !!  IF MATCHES FOUND, PRINT THEM !! **/
            $calendar.= str_repeat('<p> </p>',2);

        $calendar.= '</td>';
        if($running_day == 6):
            $calendar.= '</tr>';
            if(($day_counter+1) != $days_in_month):
                $calendar.= '<tr class="calendar-row">';
            endif;
            $running_day = -1;
            $days_in_this_week = 0;
        endif;
        $days_in_this_week++; $running_day++; $day_counter++;
    endfor;

    /* finish the rest of the days in the week */
  /*  if($days_in_this_week < 8):
        for($x = 1; $x <= (8 - $days_in_this_week); $x++):
            $calendar.= '<td class="calendar-day-np"> </td>';
        endfor;
    endif;*/

    /* final row */
    $calendar.= '</tr>';

    /* end the table */
    $calendar.= '</table>';

    /* all done, return result */
    return $calendar;
}

/* sample usages */
/*echo '<h2>July 2009</h2>';
echo draw_calendar(7,2009);

echo '<h2>August 2009</h2>';
echo draw_calendar(8,2009);
*/
$start = $startDate= $month = strtotime('2016-02-02');
$end = $endDate = strtotime('2016-03-03');

while($month < $end)
{
     //$a = date('m Y', $month), PHP_EOL;
     $startDate = $start;
     $endDate = $end;


     $newMonthInRange = date('m', $month);
     $newYearInRange = date('Y', $month);

     $newMonthInRangeTitle = date('F Y', $month);     
     $month = strtotime("+1 month", $month); 

     echo "<h1>".$newMonthInRangeTitle."</h1>";
     echo draw_calendar($newMonthInRange,$newYearInRange,$startDate,$endDate);
}
?>