PHP Classes

Class Calendar: Generate month calendar arrays

Recommend this page to a friend!
  Info   Screenshots Screenshots   View files View files (5)   DownloadInstall with Composer Download .zip   Reputation   Support forum (1)   Blog    
Ratings Unique User Downloads Download Rankings
Not yet rated by the usersTotal: 852 All time: 4,078 This week: 188Up
Version License Categories
class_calendar 1.0.0GNU Lesser Genera...Time and Date
Description Author

This class can generate multi-dimensional arrays containing the days of any given month across the span of weeks that the month days occupy.

It takes a given month and year as parameters and it fills the multi-dimensional array, that represents the weeks and the week days, with the respective number of the days of the month.

The array positions that represent days before and after the current month are filled with 0.

The class can also return the month name, month length in days, tell you if a given year is a leap year or not, and the week day name of a given day of the month.

Also, worth noting, the function valid_date will make sure that any month, day, and year are within valid parameters. For example, using the date 13/32/2005 by default is invalid. If you pass this date to valid_date, it would convert that date to 2/1/2006. This is important if accepting user input from a calendar.

Picture of Ken Stanley
Name: Ken Stanley <contact>
Classes: 2 packages by
Country: United States United States
Age: 45
All time rank: 1381195 in United States United States
Week rank: 1311 Up134 in United States United States Up

!! LEAST TAKE THE TIME TO READ IT!                                                   !!

Contact Information:
	If you find a bug, by all means please send me an email and describe to me how to
	reproduce it. If you can include your source files, it will greatly speed up my
	response time to you.

	If you have read, and reread this document, and you still cannot get it to work,
	then by all means send me an email, and I will do my best to help you (as my
	time and workload permit). But, you MUST demonstrate to me that you have read
	this document.

	Ken Stanley <>
Requirements:	PHP 4, and Apache compatible web server
				This software was built using PHP 4 and Apache 1.3.33.
				While everything in this class should be cross-compatible,
				due to lack of resources and desire, I have not checked.
				If you are using different setups and find problems, and
				can fix them, please send me unified diffs (diff -u my_file your_file)
				and contact information you'd like me to display. This software doe
				not use any special PHP modules, so any installation _should_ work.

Optional:		SQLite 1.0.3 from PECL <>
				If SQLite support is not present or not enabled, then you will not
				have access to the SQLite features. By this, I mean that add_event,
				del_event, get_event and num_events will always return FALSE. The
				rest of the class will function as normal.
TODO: Allow for the day of the week to optionally start on a Monday.
      Translate into other languages (I NEED HELP WITH THIS, PLEASE!)

I. Introductions

Congratulations on picking my calendar class! I hope you will find this as useful
as I have. The benefit to this class over PHP's date() function is that you are
not limited to date()'s 1901-2038 limitation from PHP. You can reasonably now take
your calendars as far back as 1752 with accuracy with the English calendar (anything
before that, use at your own risk).

II. Usage

Included with this distribution you should have recieved index.php which contains
example usage that you can see in action. Let's go over a few key points, just so
there is little misunderstanding:

Create a new instance of the class:

		$cal = new calendar();

		print_r($cal->get_month(1, 2005)); // Prints out an array for January 2005

Set a valid range of years:

		$cal = new calendar();
		$cal->min_year = 1901;
		$cal->max_year = 2038;

		print_r($cal->get_month(0, 2039); // Prints out an array for December 1901

Let's stop here for a second. Did you notice something odd about the last example?
I hope so! The dates WILL roll over automatically. It does the hard work of ensuring
that months are 1-12, and if you set it, the years are within min and max ranges.
What's not shown here, and automatically done, is it will roll over the days too.
If you use something like 0, any negative number, or a number greater than the total
days of a month, it will resepctively roll everything over accordingly.

The hardest part of this library is formatting your calendar into HTML. Let me give
you a simple example:


		$cal = new calendar();
		$cal->pad_dates = TRUE;
		$array = $cal->get_month(1, 2005);

		echo "<table border=0>\n";
		echo "<tr>\n";
		echo "<td colspan=7 align=center>\n";
		echo $cal->day_name($cal->get_day(1, 1, 2005)) . ", " . $cal->month_name(1) . ", 2005\n";
		for ($i = 0; $i < 6; $i++) {
			echo "<tr>\n";
			for ($j = 0; $j < 7; $j++) {
				if ($array[$i][$j] != 0)
					echo "<td>" . $array[$i][$j] . "</td>\n";
					echo "<td>&nbsp;</td>\n";
			echo "</tr>\n";

This outputs a real simple calendar:

           Saturday, January, 2005  
			02 03 04 05 06 07 08 
            09 10 11 12 13 14 15 
			16 17 18 19 20 21 22 
            23 24 25 26 27 28 29 
            30 31           

There is now the ability to define what day of the week your calendar uses. Simply set the
start_monday to either 0 or 1 (0 = Sunday; 1 = Monday). Since there is now language support
included with class_calendar, if you choose a supported language, it will automatically 
adjust for the start of the week for you! Just set the language variable to your two-letter
country code (i.e. one of 'en', 'hu', 'fr', 'de', or 'it'). If you wish to add your language
to the calendar, just edit class_calendar.php and add your language to the calendar()
constructor or email me directly with your translation and I'll add it for you.

III. SQLite Support

To take full advantage of this class, you should have SQLite support included in PHP. This
can be done by compiling the SQLite module located at
and following these simple instructions:

    a. Run the following command and parameters (as root): `pear install sqlite`
    b. Install the module by hand:
        > wget
        > tar xzf SQLite-1.0.3.tgz
        > cd sqlite
        > export PHP_PREFIX="/usr"
        > $PHP_PREFIX/bin/phpize
        > ./configure
        > make
        > make install

One of the two above steps will install into your default PHP extensions directory.
After doing that, the only thing left to do is to create the empty database file for SQLite to

    (We'll use /opt/www/htdocs/include as the directory that class_calendar.php and
     class_sqlite.php are in.)
    > cd /opt/www/htdocs/include
    > mkdir db
    > chmod 1777 db
    > touch db/calendar.sdb
    > chmod 666 db/calendar.sdb

It is very important that the webserver can not only write to the file, but also to the
directory that the file is in. This has been tested and found to work just fine. For those
that are unfamilar with stick-bit permissions (the 1 in 1777), this simply tells the
filesystem that anybody can write to the directory, but only the owner can delete the files
they have created. Simply put, it's a security measure.

And thats it! The class will try to load the SQLite module, and if that is successful, it 
will look for the database file. If it can properly write to the file it will then, and only
then, allow you to use the SQLite features of this class.

IV. Prologue

This class has aimed to be as simple to use as possible. While the included index.php has
many lines of code in it, it is only to demonstrate every feature of this class. You could
invariably write your calendar in as few as 30-40 lines of code (if not, less).

While this software has been pretty well tested by me, there may be a bug or two hidden in
there somewhere. If you decide to help the development of this class by submitting a bug
report that you include as much information as you can on how to reproduce the bug in
question; include the section of code causing the bug, if you can.

I will do my very best to respond as quickly as possible. Due to time constraints (i.e. job,
personal life, etc) I may not be able to respond right away. Please be patient. The quality 
of this work is very important to me, as are the happiness of my users. I want this to be the
best damned calendar anybody has ever seen or used.

V. Acknowledgements

I'd like to thank a couple people who have contributed with either suggestions or code:

Koós Zoltán   - For writing the math to start the week on Sunday or Monday and for the Hungarian
Chris Staniek - For suggesting that I impliment database storage in my calendar.
Jeremy Speer  - For inadvertantly introducing me to the idea of using SQLite.

VI. Developer's API

Below are the class API functions you can use on your own:
(Refer to index.php for live implementations)

	Name:			calendar() [class constructor]
	Params:			string lang, string database_filename
	Returns:		void
	Description:	Sets up connection to SQLite database_filename, and if
					necessary, it will create the database first (first run).
					You MUST create a subdirectory and chown it to your 
					webserver's user:group! After doing that, you MUST make
					the file writeable by the webserver (e.g. chmod 666 <file>).
					Not doing this will generate a read/write error.

	Name:			get_month()
	Params:			int month, int year
	Returns:		array()
	Description:	Returns a multi-dimension array containing
					the calendar month. The first layer of the
					array are the weeks, and the second layer
					are the days:

					week 1: sun, mon, tue, wed, thu, fri, sat 
					week 2: sun, mon, tue, wed, thu, fri, sat 
					week 3: sun, mon, tue, wed, thu, fri, sat 
					week 4: sun, mon, tue, wed, thu, fri, sat 
					week 5: sun, mon, tue, wed, thu, fri, sat 
					week 6: sun, mon, tue, wed, thu, fri, sat 

					This is for easy user-formatting. See README
					for example code.
	Name:			get_day()
	Params:			int month, int day, int year
	Returns:		int
	Description:	Returns the day of the week for the given
					date as a number between 0-6:

					0 = Sunday/Monday
					1 = Monday/Tuesday
					2 = Tuesday/Wednesday
					3 = Wednesday/Thursday
					4 = Thursday/Friday
					5 = Friday/Saturday
					6 = Saturday/Sunday

	Name:			day_name()
	Params:			int day, int short
	Returns:		string
	Description:	Converts the numerical format of month (0-6) into
					human-readable format. You can control the
					size of the name by passing either a 1 (Full),
					2 (First 3 letters), or 3 (First letter only)
					as the second parameter.

	Name:			month_name()
	Params:			int month, int short
	Returns:		string
	Description:	Converts the numerical format of month (1-12)
					into human-readable format. You can control the
					size of the name by passing either a 1 (Full),
					2 (First 3 letters), or 3 (First letter only)
					as the second parameter.

	Name:			is_leap()
	Params:			string year
	Returns:		bool TRUE/FALSE
	Description:	Returns either TRUE or FALSE depending
					on whether a year is a leap year or not.

	Name:			month_length()
	Params:			int month, int year
	Returns:		int
	Description:	Returns the length of given month for
					given year.

	Name:			valid_date()
	Params:			int month, int day, int year
	Returns:		void
	Description:	This function takes care to ensure the
					validity of the date given. E.g. -1/01/2005
					would be converted to 12/01/2004, and 13/01/2005
					would be converted to 01/01/2006.

	Name:			valid_month()
	Params:			int month, int year
	Returns:		void
	Description:	Used in valid_date to roll over the month so it
					stays within 1-12 constraints.

	Name:			valid_day()
	Params:			int month, int day, int year
	Returns:		void
	Description:	Used in valid_date to roll over the day so it
					stays within 1-(whatever the last day is)

	Name:			valid_year()
	Params:			int year
	Returns:		void
	Description:	Used in valid_date to roll over the year so it
	 				stays within user-specified constraints.

					NOTE: This function is COMPLETELY optional. To
					disable it's use, DO NOT SET $this->min_year or

	Name:			add_event()
	Params:			int month, int day, int year, mixed string
	Returns:		bool TRUE/FALSE
	Description:	Adds an event for given month/day/year to the SQLite database.

	Name:			del_event()
	Params:			int id
	Returns:		bool TRUE/FALSE
	Description:	Removes an event from the database by given id.

	Name:			get_event()
	Params:			int month, int day, int year
	Returns:		mixed event
	Description:	Retrieves an event for the given month/day/year from the database.

	Name:			num_events()
	Params:			int month, int day, int year
	Returns:		int rows or bool FALSE
	Description:	Returns the number of events for given month/day/year.
  • class_calendar.png
  Files folder image Files  
File Role Description
Accessible without login Plain text file ChangeLog Doc. Notes of all changes and by when and whom they are made by.
Accessible without login Plain text file class_calendar.php Class Main Class
Accessible without login Plain text file class_sqlite.php Class Simple SQLite API
Accessible without login Plain text file index.php Example Advanced Usage Example
Accessible without login Plain text file README Doc. License, Examples, and Documentation

 Version Control Unique User Downloads Download Rankings  
This week:0
All time:4,078
This week:188Up
For more information send a message to info at phpclasses dot org.