Since iCalendar is an important data format, it’s worth looking a bit more at how to manipulate it in PHP and Python.
![]() | Note |
|---|---|
The hCalendar microformat is designed to express the same information as iCalendar but in a form that is embeddable in HTML and RSS. See Chapter 18 on microformats for how to use and create hCalendar. |
A good Python module to use is iCalendar:
http://codespeak.net/icalendar/
As of this writing, the latest version is 1.2. You download this code here:
http://codespeak.net/icalendar/iCalendar-1.2.tgz
To run a basic test of iCalendar interoperability, I created an event on Apple iCal and e-mailed it to myself. On my notebook, the filename is as follows:
D:\Document\Docs\2007\05\iCal-20070508-082112.ics
What’s actually in the file?
BEGIN:VCALENDAR
VERSION:2.0
X-WR-CALNAME:open house at the Academy
PRODID:-//Apple Computer\, Inc//iCal 2.0//EN
CALSCALE:GREGORIAN
METHOD:PUBLISH
BEGIN:VTIMEZONE
TZID:US/Pacific
LAST-MODIFIED:20070508T152112Z
BEGIN:DAYLIGHT
DTSTART:20070311T100000
TZOFFSETTO:-0700
TZOFFSETFROM:+0000
TZNAME:PDT
END:DAYLIGHT
BEGIN:STANDARD
DTSTART:20071104T020000
TZOFFSETTO:-0800
TZOFFSETFROM:-0700
TZNAME:PST
END:STANDARD
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=US/Pacific:20070510T190000
DTEND;TZID=US/Pacific:20070510T200000
SUMMARY:open house at the Academy
UID:AAE603F6-A5A1-4E11-91CF-E6B06649A756
ORGANIZER;CN="Raymond Yee":mailto:rdhyee@yahoo.com
SEQUENCE:6
DTSTAMP:20070508T152047Z
END:VEVENT
END:VCALENDAR
Now, I want to read it in using Python. Let’s also consult the documentation to build a simple example:[256]
from icalendar import Calendar
fname = r'D:\Document\Docs\2007\05\iCal-20070508-082112.ics'
cal = Calendar.from_string(open(fname,'rb').read())
ev0 = cal.walk('vevent')[0]
print ev0.keys()
print "summary: ", str(ev0['SUMMARY'])
print "start:", str(ev0['DTSTART'])
# ev0['DTSTART'] is datetime.date() object
print "end:", str(ev0['DTEND'])
If you run it, you get this:
['DTSTAMP', 'UID', 'SEQUENCE', 'SUMMARY', 'DTEND', 'DTSTART', 'ORGANIZER']
summary: open house at the Academy
start: 20070510T190000
end: 20070510T200000
Another Python iCalendar library is vobject:
http://vobject.skyhouseconsulting.com/usage.html
The following code shows how to use vobject to parse the same iCalendar file:
import vobject
fname = r'D:\Document\Docs\2007\05\iCal-20070508-082112.ics'
cal = vobject.readOne(open(fname,'rb').read())
event = cal.vevent
print event.sortChildKeys()
print "summary: ", event.getChildValue('summary')
print "start:", str(event.getChildValue('dtstart'))
# event.getChildValue('dtstart') is datetime.date() object
print "end:", str(event.getChildValue('dtend'))
You can download iCalcreator, a PHP library for parsing and creating iCalendar files, here:
http://www.kigkonsult.se/iCalcreator/index.php
The module is documented here:
http://www.kigkonsult.se/iCalcreator/docs/using.html
Here is some code using iCalcreator to read and parse the same iCalendar file from the previous section:
<?php
require_once 'iCalcreator/iCalcreator.class.php';
$filename = 'D:\Document\Docs\2007\05\iCal-20070508-082112.ics';
$v = new vcalendar(); // initiate new CALENDAR
$v->parse($filename);
# get first vevent
$comp = $v->getComponent("VEVENT");
#print_r($comp);
$summary_array = $comp->getProperty("summary", 1, TRUE);
echo "summary: ", $summary_array["value"], "\n";
$dtstart_array = $comp->getProperty("dtstart", 1, TRUE);
$dtstart = $dtstart_array["value"];
$startDate = "{$dtstart["year"]}-{$dtstart["month"]}-{$dtstart["day"]}";
$startTime = "{$dtstart["hour"]}:{$dtstart["min"]}:{$dtstart["sec"]}";
$dtend_array = $comp->getProperty("dtend", 1, TRUE);
$dtend = $dtend_array["value"];
$endDate = "{$dtend["year"]}-{$dtend["month"]}-{$dtend["day"]}";
$endTime = "{$dtend["hour"]}:{$dtend["min"]}:{$dtend["sec"]}";
echo "start: ", $startDate,"T",$startTime, "\n";
echo "end: ", $endDate,"T",$endTime, "\n";
?>
The output of the code is as follows:
summary: open house at the Academy
start: 2007-05-10T19:00:00
end: 2007-05-10T20:00:00
I will use iCalcreator in the following section to convert iCalendar feeds into Google calendar entries.