Build A Calendar Table | CSS-Tricks (2024)

Psst! Create a DigitalOcean account and get $200 in free credit for cloud-based hosting and services.

  1. Mike

    Permalink to comment#

    How would i alter this to highlight the current day?

    Reply

    • Jason

      Permalink to comment#

      Add this two vars to the top of script:

      $today_date = date("d");$today_date = ltrim($today_date, '0');

      Then change the date loop to the following:

       while ($currentDay <= $numberDays) { // Seventh column (Saturday) reached. Start a new row. if ($dayOfWeek == 7) { $dayOfWeek = 0; $calendar .= "</tr><tr>"; } $currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT); $date = "$year-$month-$currentDayRel"; if($currentDayRel == $today_date ){ $calendar .= "<td class='day' id='today_date ' rel='$date'><b>$currentDay</b></td>"; } else { $calendar .= "<td class='day' rel='$date'>$currentDay</td>"; } // Increment counters $currentDay++; $dayOfWeek++; }

      Use the id=’today_date ‘ in your css to change the days appearance….

      Hope this helps…
      – Jason

  2. Brian Dady

    Permalink to comment#

    These functions may also be used. The first creates a calendar a specific month/year, and the second creates a full year calendar from specified month/year.

    //For Specific Month and Year
    $month = "3"; //Number of month (1-12)
    $year = "2010"; //Four digets
    echo build_calendar($month,$year,$dateArray);

    //For all Months in Specific Year
    $year = "2010";
    $i = 1;
    $month=1; //Numeric Value
    while($i <'s= 12){
    echo build_calendar($month,$year,$dateArray);
    $month=$month+1;
    $i++;}

    Reply

    • Brian Dady

      Permalink to comment#

      The second code should actually read:

      //For all Months in Specific Year
      $year = "2010";
      $i = 1;
      $month=1; //Numeric Value
      while($i <'s= 12){
      echo build_calendar($month,$year,$dateArray);
      $month=$month+1;
      $i++;}

    • Mark

      Permalink to comment#

      This is pretty neat. Thank you.
      I still cannot get the complete year to work however.
      Any ideas?

    • seuser

      Permalink to comment#

      while($i <= 12){
      instead of while($i <'s= 12){

  3. Zachary

    Permalink to comment#

    Could you post on how to have events (localhost database) displayed in the calendar and also have calendar controls such as picking of the month, year and next & previous month. Thanks

    Zachary ([emailprotected])

    Reply

    • Jason

      Permalink to comment#

      Just query your database by the date of the event… explode the string so that you only get the day in a one digit format. Then in the date print loop (see my above code), check to see if the date queried equals the $currentDay. If it does, print the event(s) data. It will re-query every time with the new date.

      Example

      $result = mysql_query("SELECT event_title FROM events WHERE event_date = '".$currentDay."'") or die(mysql_error());$row = mysql_fetch_array($result);$num_results = mysql_num_rows($result); if ($num_results > 0){ echo $row['event_title']; } else{ } 

      Put the code while ($currentDay <= $numberDays) { } loop…

      while ($currentDay <= $numberDays) { // Seventh column (Saturday) reached. Start a new row. if ($dayOfWeek == 7) { $dayOfWeek = 0; $calendar .= "</tr><tr>"; } $currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT); $date = "$year-$month-$currentDayRel"; if($currentDayRel == $today_date ){ $calendar .= "<td class='day' id='today_date ' rel='$date'><b>$currentDay</b>";$result = mysql_query("SELECT event_title FROM events WHERE event_date = '".$currentDay."'") or die(mysql_error());$row = mysql_fetch_array($result);$num_results = mysql_num_rows($result); if ($num_results > 0){$i=0;while($i <= $num_results) { $calendar.= $row['event_title']; }} else{ } $calendar.= "</td>"; } else { $calendar .= "<td class='day' rel='$date'>$currentDay</td>"; } // Increment counters $currentDay++; $dayOfWeek++; }

      Double check my request query loop, but that should work…

  4. anup

    Permalink to comment#

    It’s really a good script and idea to implement. Nice one! Dev. can use / customize with his needs. ;)

    Reply

  5. Pritesh Patel

    Permalink to comment#

    Questions, what is the third argument $dateArray for? Seems to me there’s no reference in the function for this argument.

    Great tool. I wish there was a way to change the month but this would require ajax or using an iframe.

    Reply

    • Kevin

      Permalink to comment#

      Change:

       $calendar .= "<td class='day' rel='$date'>$currentDay</td>";

      To something like this (displays the date information next to the date):

       $calendar .= "<td class='day' rel='$date'>$currentDay"; if(isset($dateArray[mktime(0, 0, 0, $month, $currentDay, $year)])){ $calendar.=$dateArray[mktime(0, 0, 0, $month, $currentDay, $year)]; } $calendar.="</td>";

      Or this (links to a page for specific dates):

       $calendar .= "<td class='day' rel='$date'>"; if(isset($dateArray[mktime(0, 0, 0, $month, $currentDay, $year)])){ $calendar.="<a href=\"$dateArray[mktime(0, 0, 0, $month, $currentDay, $year)]\">$currentDay</a>"; }else{ $calendar.=$currentDay; } $calendar.="</td>";

      and build the array elsewhere. See the page I linked to my name for output (I still need to clean up some formatting).

  6. Navee

    Permalink to comment#

    Likewise…what IS the 3rd argument $dateArray for? I’m getting undefined variable errors as a result. Removed both references of it from the code and the Calendar appears fine without errors.

    Reply

  7. Irene

    Permalink to comment#

    Hi
    I am learning to put a calendar on a web blog and came across this thread. Could you please tell me what is the full script etc for the calendar please…..

    Thanks in advance
    Irene

    Reply

  8. Dylan

    Permalink to comment#

    My small change to have the week start on Monday:

    $dayOfWeek = $dateComponents['wday'] - 1; // fix for monday startif ($dayOfWeek < 0) { $dayOfWeek = 6;}

    Also just change the $daysOfWeek array.

    Hope it works :)

    Reply

    • Dan

      Permalink to comment#

      Brilliant! Just what I was looking for :D

    • Artur

      Permalink to comment#

      Short version:

      $dayOfWeek = ($dateComponents[‘wday’] + 6) % 7;

  9. :: kevin :: UK ::

    Permalink to comment#

    Awesome, love it.
    Thank you for a great bit of code, and to the guys that left feedback with optional changes that really do improve the calendar’s functionality

    Reply

  10. Dery

    Permalink to comment#

    hi ,i’m a student in senior high school (newbie) , i implemented this in fuelphp but there are some bug ,

    <?php

    class Controller_Calendar extends Controller_Timetable{
    public function before(){
    parent::before();
    }

    public function build_calendar($month,$year) {

    // Create array containing abbreviations of days of week.
    $daysOfWeek = array('S','M','T','W','T','F','S');

    // What is the first day of the month in question?
    $firstDayOfMonth = mktime(0,0,0,$month,1,$year);

    // How many days does this month contain?
    $numberDays = date('t',$firstDayOfMonth);

    // Retrieve some information about the first day of the
    // month in question.
    $dateComponents = getdate($firstDayOfMonth);

    // What is the name of the month in question?
    $monthName = $dateComponents['month'];

    // What is the index value (0-6) of the first day of the
    // month in question.
    $dayOfWeek = $dateComponents['wday'];

    // Create the table tag opener and day headers

    $calendar = "";
    $calendar .= "$monthName $year";
    $calendar .= "";

    // Create the calendar headers

    foreach($daysOfWeek as $day) {
    $calendar .= "$day";
    }

    // Create the rest of the calendar

    // Initiate the day counter, starting with the 1st.

    $currentDay = 1;

    $calendar .= "";

    // The variable $dayOfWeek is used to
    // ensure that the calendar
    // display consists of exactly 7 columns.

    if ($dayOfWeek > 0) {
    $calendar .= "";
    }

    $month = str_pad($month, 2, "0", STR_PAD_LEFT);

    while ($currentDay <= $numberDays) {

    // Seventh column (Saturday) reached. Start a new row.

    if ($dayOfWeek == 7) {

    $dayOfWeek = 0;
    $calendar .= "";

    }

    $currentDayRel = str_pad($currentDay, 2, "0", STR_PAD_LEFT);

    $date = "$year-$month-$currentDayRel";

    $calendar .= "$currentDay";

    // Increment counters

    $currentDay++;
    $dayOfWeek++;

    }

    // Complete the row of the last week in month, if necessary

    if ($dayOfWeek != 7) {

    $remainingDays = 7 - $dayOfWeek;
    $calendar .= "";

    }

    $calendar .= "";

    $calendar .= "";

    return $calendar;

    }
    $dateComponents = getdate();
    $i = 1;
    $month=1; //Numeric Value
    while($i

    ErrorException [ Parsing Error ]: syntax error, unexpected T_VARIABLE, expecting T_FUNCTION in $dateComponents = getdate();

    can all of you explain this problem with me ?

    Reply

  11. etob

    Permalink to comment#

    Very good script. Concise and short. Thanks

    My small changes to highlight specified dates:

    Before calling main function: $dateArray = array('FEB04','MAR20');

    Inside main function: $monthNameShort = strtoupper(substr($monthName,0,3));

    Inside while ($currentDay <= $numberDays)' loop:

    $date = "$monthNameShort$currentDayRel";if (in_array($date,$dateArray)) $calendar .= "<td class='day' title='$date'><b>$currentDay</td>"; //bold else $calendar .= "<td class='day' title='$date' style='color:grey;'>$currentDay</td>"; //grey

    Reply

  12. Mehul Boricha

    Permalink to comment#

    Thanks a lot.

    Reply

  13. Green

    Permalink to comment#

    How can I create a calendar with some dates from previous month and next month. For example: http://st.rfclipart.com/image/big/c4-e1-9f/february-2013-calendar-month-Download-Royalty-free-Vector-File-EPS-13946.jpg
    Thanks advanced!

    Reply

    • Perch

      Permalink to comment#

      Bump. I’d like to know this too.

      :0)

      Perch

  14. Richie

    Permalink to comment#

    Have no idea if You will be interest in, but I add few lines of code for listing monthBYmonth throu the calendar. I had problem with $dateComponents. I have no idea how to work with so I remove it and use (for me more simple) DATE and MKTIME.

    If You will use it, put it onto bottom of code:

    $next = $_GET["next"];$prev = $_GET["prev"];$today = $_GET["today"];$nextlist = $_GET["nextlist"];$prevlist = $_GET["prevlist"];if ($next == "next") {$month=date('n', $nextlist);$monthName=date('F', $nextlist);$year=date('Y', $nextlist);}elseif ($prev == "prev") {$month=date('n', $prevlist);$monthName=date('F', $prevlist);$year=date('Y', $prevlist);}elseif ($today == "today") {$month=date('n');$monthName=date('F');$year=date('Y');}else {$month=date('n');$monthName=date('F');$year=date('Y');}$curlist = mktime(0, 0, 0, $month, 1, $year);$nextlist = mktime(0, 0, 0, $month+1, 1, $year);$prevlist = mktime(0, 0, 0, $month-1, 1, $year);echo "<a id=\"prev\" href=\"new.php?prev=prev&prevlist=$prevlist\"><<</a> <a id=\"today\" href=\"new.php?today=today\"> today </a> <a id=\"next\" href=\"new.php?next=next&nextlist=$nextlist\">>></a>"; echo build_calendar($month,$year,$dateArray);

    Reply

  15. liviu

    Permalink to comment#

    function renderMonth($displayM, $displayY){ $daysOfWeek = array ( 'Mon', 'Tue', 'Wen', 'Thu', 'Fri', 'Sat', 'Sun' ); $dateUtil = new DateTime ( $displayY . "/" . $displayM . "/01" ); $year = $dateUtil->format ( "Y" ); $week = $dateUtil->format ( "W" ); $week_start = new DateTime (); $week_start->setISODate ( $year, $week ); $nextDay = clone $week_start; $i = 1; $weekdays = 7; // how many days do we display per row $currday = 1; // current week day $daysno = 35; // number of display dates $calendar = '<table class="event-calendar">'; $calendar .= "<thead>"; $calendar .= "<tr>"; foreach ( $daysOfWeek as $day ) { $calendar .= "<th>$day</th>"; } $calendar .= "</tr>"; $calendar .= "</thead>"; $calendar .= "<tbody>"; while ( $i < $daysno ) { if ($i == 1) { $calendar .= '<tr>'; $calendar .= '<td>' . $nextDay->format ( 'd M' ) . '</td>'; } $currday ++; if ($currday > $weekdays) { $calendar .= '</tr>'; $calendar .= '<tr>'; $currday = 1; } $nextDay->add ( new DateInterval ( 'P1D' ) ); $calendar .= '<td>' . $nextDay->format ( 'd M' ) . '</td>'; $i ++; if ($i == $daysno) { $calendar .= '</tr>'; } } $calendar .= "</tbody>"; $calendar .= "</table>"; return $calendar;}echo renderMonth("10", "2015");

    this will fill the empty spaces with previuos or forward days of month. kind of google calendar and stuff

    Reply

  16. Bogdan

    Permalink to comment#

    Hello there! Great script. Only a small question if it is possible.
    How can i make $monthName an array. Something like:
    $monthName = array(‘January’,’February’,’March’,’April’,’May’,’June’,’July’,’August’,’September’,’October’,’November’,’December’);
    Thx in advance!

    Reply

    • Patrick

      Permalink to comment#

      Hello. Im looking for same advice. I need to make months name in my language, and this will really help me.

    • Maniac

      Permalink to comment#

      $monate = array(
      1=>”Januar”,
      2=>”Februar”,
      3=>”März”,
      4=>”April”,
      5=>”Mai”,
      6=>”Juni”,
      7=>”Juli”,
      8=>”August”,
      9=>”September”,
      10=>”Oktober”,
      11=>”November”,
      12=>”Dezember”
      );

      // What is the name of the month in question? $monthName = $monate[$dateComponents['mon']];

      have fun ;-)

  17. Carlos

    Permalink to comment#

    Hey i have a problem and i can solved anyone now how to?
    Notice: Undefined variable: today_date in D:\Server\htdocs\Ejercicios\Pruebas\Prueba2.php on line 94

    Reply

  18. Saroj

    Permalink to comment#

    Great Script Thanks. But I am trying to make custom Calendar instead of the Gregorian Calendar.

    I have to create calendar from array such as this.

    date73 = {2073,32,32,31,32,31,30,30,30,29,29,30,31}
    date74 = {2074,31,31,31,32,31,31,30,29,30,29,30,30}

    where the first date73[0] is the year and the rest of them are the days in the months. Please help.

    Reply

  19. philippe

    Permalink to comment#

    Hi, this is great thanks !

    How could it be possible to have the month as a parameter, in order to change the calendar month ?
    Maybe sending it in the url ?

    Thanks a lot

    Reply

  20. manh

    Permalink to comment#

    hi, can anybody add week column to calendar?

    Reply

    • Matthias Pettersson

      Permalink to comment#

      BUMP! I’d love to know this too =]

  21. Anit

    Permalink to comment#

    What is $dateArray doing ?!

    Reply

  22. john castaldi

    Permalink to comment#

    is there a way to make it so that the current date is always on the second week? so last week is the top, then the current week, then the next 2?

    Reply

    • Geoff Graham

      Permalink to comment#

      You’d need to retrieve dates starting earlier than the current month. I haven’t played with this snippet, but perhaps setting $currentDay to a negative number for how many days you want to go back is the first step.

  23. YupYup

    Permalink to comment#

    Lovely :) Any way to show the full year but with 1 to 31 across the top and then the months down the side? Trying the build an attendance card where a dot will be placed in the day the student attends.

    Hope this makes sense :)

    Reply

  24. Arnd

    Permalink to comment#

    Thanks. But what do I need to change if the week starts on Monday?

    Reply

    • Smid98

      Permalink to comment#

      Just change the days of week array in to the correct order.
      And change

      $dayOfWeek = $dateComponents[‘wday’];

      to

      $dayOfWeek = ($dateComponents[‘wday’] + 6) % 7;

  25. franki

    Permalink to comment#

    It seems to me an excellent code,
    I have managed to add a url for each day by adding the following code,….. when clicking on each day it shows a page.

    $calendar .= “<a href=’http://url.com.php?date=$date>$currentDay“;

    Do you have any idea how can I display the url inside an iframe on the same page?

    Reply

Leave a Reply

Build A Calendar Table | CSS-Tricks (2024)
Top Articles
Latest Posts
Article information

Author: Reed Wilderman

Last Updated:

Views: 6008

Rating: 4.1 / 5 (72 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Reed Wilderman

Birthday: 1992-06-14

Address: 998 Estell Village, Lake Oscarberg, SD 48713-6877

Phone: +21813267449721

Job: Technology Engineer

Hobby: Swimming, Do it yourself, Beekeeping, Lapidary, Cosplaying, Hiking, Graffiti

Introduction: My name is Reed Wilderman, I am a faithful, bright, lucky, adventurous, lively, rich, vast person who loves writing and wants to share my knowledge and understanding with you.