Single day all day appointments in .ics files

Viewed 52082

I'm creating an ics file using ASP.NET for importing holiday into Outlook 2007 and trying to set the all-day-event flag. This works fine on multi-day holidays, but for single days, it doesn't seem to be registering, I just get a 'singularity holiday' booked from midnight to midnight.

According to MSDN, setting the start and end times to 00:00 should be enough to do this. I've also tried using the X-MICROSOFT-CDO-ALLDAYEVENT and X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT flags, but they don't seem to have any effect.

Can anyone see where I'm going wrong? I've included sample ouput below.

BEGIN:VCALENDAR
PRODID:-//Microsoft Corporation//Outlook 12.0 MIMEDIR//EN
VERSION:2.0
METHOD:PUBLISH
X-MS-OLK-FORCEINSPECTOROPEN:TRUE
BEGIN:VEVENT
CLASS:PUBLIC
DESCRIPTION:HOLIDAY\n
DTEND;VALUE=DATE:20090727
DTSTAMP:20091111T000000Z
DTSTART;VALUE=DATE:20090727
LAST-MODIFIED:20091111T000000Z
PRIORITY:5
SEQUENCE:0
SUMMARY;LANGUAGE=en-gb:HOLIDAY
TRANSP:OPAQUE
X-ALT-DESC;FMTTYPE=text/html:HOLIDAY
X-MICROSOFT-CDO-BUSYSTATUS:OOF
X-MICROSOFT-CDO-IMPORTANCE:1
X-MICROSOFT-DISALLOW-COUNTER:FALSE
X-MS-OLK-ALLOWEXTERNCHECK:TRUE
X-MS-OLK-CONFTYPE:0
X-MICROSOFT-CDO-ALLDAYEVENT:TRUE
X-MICROSOFT-MSNCALENDAR-ALLDAYEVENT:TRUE
END:VEVENT
END:VCALENDAR
8 Answers

anmari's answer appears to be the most accurate for current version of both calendar and Outlook365. If one puts in a start and end that are the same, it goes into Calendar as a midnight event and it goes into Outlook365 as an all day event that ends the day before it starts. The only way for it to work with both is for the end date to be one day later than the start. Plus, don't include the DTSTAMP and put the DTSTART and DTEND in the date format not the date time format.

I just changed the way the date was formatted and it worked for me.

Eg. I had this:

DTSTART: " . date(ICAL_FORMAT, strtotime($event->date)) . "
DTEND:" . date(ICAL_FORMAT, strtotime($event->date)) . "

Changed to:

DTSTART:" . date('Ymd', strtotime($event->date)) . "
DTSTAMP:" . date('Ymd', strtotime($event->created_at)) . "
Related