All-day events vs timed events: ICS patterns that confuse clients
Level: intermediate · ~14 min read · Intent: informational
Audience: Developers, Product teams, Ops engineers, Event platform teams, SaaS founders
Prerequisites
- Basic familiarity with calendar events
- Basic understanding of time zones
- Optional: comfort reading structured text formats
Key takeaways
- All-day ICS events use DATE values, while timed events use DATE-TIME values.
- DTEND is non-inclusive, which is why multi-day all-day events end on the day after the last visible day.
- Most client confusion comes from mixing all-day semantics with time zones, UTC midnight values, or incorrect DTEND logic.
- Test imports in at least Outlook, Google Calendar, and Apple Calendar when interoperability matters.
References
FAQ
- What is the difference between an all-day ICS event and a timed ICS event?
- An all-day ICS event uses DATE values like DTSTART;VALUE=DATE:20260425, while a timed event uses DATE-TIME values like DTSTART:20260425T150000Z or DTSTART;TZID=Africa/Johannesburg:20260425T170000.
- Why does my all-day event show up as two days in some calendar apps?
- The usual cause is an incorrect DTEND value. In ICS, DTEND is non-inclusive, so the end date for an all-day event must be the day after the last visible day.
- Should all-day events use UTC times?
- Usually no. True all-day events should generally be modeled as DATE values instead of midnight UTC DATE-TIME values, which can shift across time zones and create confusing imports.
- Can Outlook, Google Calendar, and Apple Calendar all import ICS files?
- Yes, but import behavior can differ slightly, especially around all-day interpretation, time zones, recurrence, and whether the event is imported or subscribed to.
All-day events vs timed events: ICS patterns that confuse clients
This is one of the most common calendar-format mistakes teams make: they think “all-day” and “timed” are just two visual display options in a calendar UI. In ICS, they are different data models.
That distinction matters because calendar clients do not guess in the same way. If your ICS file models an all-day event like a timed midnight event, one client may show it correctly, another may shift it by a day, and another may turn it into a two-day block that makes your users think the invite is broken.
If you want the fastest implementation path first, use the ICS File Generator, the Calendar Invite Generator, or the Outlook ICS Generator. For user-facing event flows, the Add to Calendar Generator is often the better companion.
Why this topic causes real production issues
This is not just a formatting detail. It affects:
- webinar invites
- booking confirmations
- appointment reminders
- internal company holidays
- product launches
- recurring training sessions
- conference schedules
- public event downloads
When all-day and timed semantics are mixed incorrectly, teams run into problems like:
- an all-day holiday importing as 2:00 AM to 2:00 AM
- a one-day event appearing across two days
- a timed meeting losing its intended local timezone
- a recurring series drifting around daylight-saving changes
- Outlook, Google Calendar, and Apple Calendar displaying the same file differently
That is why this page should be treated as a practical interoperability guide, not a thin ICS definition page.
The core difference: DATE vs DATE-TIME
In iCalendar, the difference starts with the value type.
All-day events use DATE
A true all-day event uses calendar dates, not times. The standard example looks like this:
BEGIN:VEVENT
UID:holiday-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART;VALUE=DATE:20260425
SUMMARY:Public Holiday
END:VEVENT
This represents a one-day all-day event.
Timed events use DATE-TIME
A timed event uses a date and a time, either with UTC or with a local time plus timezone identifier.
BEGIN:VEVENT
UID:demo-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART:20260425T150000Z
DTEND:20260425T160000Z
SUMMARY:Client Demo
END:VEVENT
or
BEGIN:VEVENT
UID:demo-20260425-jhb@example.com
DTSTAMP:20260411T120000Z
DTSTART;TZID=Africa/Johannesburg:20260425T170000
DTEND;TZID=Africa/Johannesburg:20260425T180000
SUMMARY:Client Demo
END:VEVENT
If you remember only one rule, remember this: all-day events are not just timed events set to midnight.
How all-day events really work in ICS
The iCalendar standard says that anniversary-style and daily-reminder-style VEVENT components use a DATE value type for DTSTART, and if they include DTEND, it must also be a DATE. The standard also says DTEND is non-inclusive. For DATE events with no DTEND or DURATION, the duration is taken to be one day. citeturn507778view0turn507778view1turn507778view4
That one paragraph explains most real-world confusion.
One-day all-day event
A single all-day event can be written like this:
BEGIN:VEVENT
UID:holiday-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART;VALUE=DATE:20260425
SUMMARY:Public Holiday
TRANSP:TRANSPARENT
END:VEVENT
Because no DTEND is present, calendar apps treat it as lasting one day. citeturn507778view1
Multi-day all-day event
A multi-day all-day event must use an end date after the final displayed date.
BEGIN:VEVENT
UID:festival-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART;VALUE=DATE:20260425
DTEND;VALUE=DATE:20260428
SUMMARY:Annual Festival
TRANSP:TRANSPARENT
END:VEVENT
This shows on April 25, April 26, and April 27. It does not show on April 28, because DTEND is non-inclusive. That is exactly how RFC 5545 models all-day multi-day events. citeturn507778view0turn507778view4
How timed events work in ICS
Timed events are more familiar because they behave like meetings and appointments.
BEGIN:VEVENT
UID:consultation-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART:20260425T130000Z
DTEND:20260425T140000Z
SUMMARY:Consultation Call
LOCATION:https://example.com/meet
DESCRIPTION:Initial consultation call.
END:VEVENT
These are interpreted as exact points in time rather than whole calendar days. If you omit DTEND, the standard says the event ends on the same calendar date and time as DTSTART, which is usually not what you want for a real meeting. citeturn507778view1
The biggest mistake: modeling all-day as midnight UTC
A lot of implementations try to represent all-day events like this:
DTSTART:20260425T000000Z
DTEND:20260426T000000Z
That may appear to work in one timezone, but it is not a true all-day event. It is a timed event that begins at UTC midnight and ends at UTC midnight the next day.
That creates several problems:
- users in negative offsets may see it shift to the previous local date
- clients may show the event as timed rather than all-day
- recurring all-day-style events become harder to reason about
- DST boundaries can produce confusing display changes
If the event is conceptually a whole day, model it as a DATE event, not a midnight UTC workaround. That is the cleaner standards-aligned choice. citeturn507778view0turn507778view1
When to use all-day events
Use all-day ICS events when the event is about the day itself rather than a clock time.
Good examples include:
- public holidays
- company shutdown dates
- birthdays and anniversaries
- conference day markers
- application deadlines displayed as a day
- product launch day reminders where the whole day matters more than a specific hour
In these cases, DTSTART;VALUE=DATE is usually the correct model.
When to use timed events
Use timed ICS events when attendees must show up at a specific time.
Good examples include:
- demos
- client meetings
- webinars
- interviews
- reservation windows
- training sessions
- live streams
- launches with a precise release time
These should generally use DATE-TIME values and explicit timezone handling.
Outlook, Google Calendar, and Apple Calendar: what to expect
All three major ecosystems support .ics imports, but they are not identical in how users interact with them.
Microsoft says Outlook can import events from .ics files and distinguishes appointments, meetings, and events, with events lasting at least one complete day by default. citeturn426980view1
Google Calendar supports importing .ics files on desktop through Settings → Import & Export, and imported events do not stay in sync across accounts after import. citeturn426980view2
Apple Calendar supports importing .ics files on Mac and exporting calendars as .ics files as well. citeturn426980view3
That means the file format is portable, but your product experience still needs testing in at least these three environments if imports matter.
Client behavior patterns that confuse users
1. A one-day all-day event appears as two days
This usually happens because the generator used the visible last day as DTEND instead of the day after.
Wrong:
DTSTART;VALUE=DATE:20260425
DTEND;VALUE=DATE:20260425
That does not model a one-day event correctly.
Safer options:
DTSTART;VALUE=DATE:20260425
or
DTSTART;VALUE=DATE:20260425
DTEND;VALUE=DATE:20260426
2. An all-day event becomes a midnight meeting
This happens when a file uses DATE-TIME midnight values instead of DATE values.
3. Timed events shift when imported in another region
This usually comes from floating local times or inconsistent timezone modeling.
For example, these are not equivalent in meaning:
DTSTART:20260425T150000Z
DTSTART;TZID=Africa/Johannesburg:20260425T150000
The first is a UTC moment. The second is a local wall-clock time in Johannesburg.
4. Recurring all-day events behave differently than recurring timed events
A recurring birthday modeled as VALUE=DATE is very different from a recurring 9:00 AM meeting. One repeats by day semantics; the other repeats by time semantics.
5. DST changes create “moved” events
Timed recurring events tied to local time zones can behave differently around daylight-saving transitions, depending on client behavior and timezone data. This is another reason to test recurring timed series in real target clients.
Best practices for all-day ICS events
Use VALUE=DATE for true all-day events
Do not use midnight UTC as a substitute unless you explicitly want a timed event.
Keep DTEND exclusive
For multi-day all-day events, set the end date to the day after the final visible date.
Avoid mixing DATE and DATE-TIME inside the same event boundary
If DTSTART is a DATE, DTEND should also be a DATE for that event pattern. RFC 5545 is explicit on this point for anniversary-style all-day VEVENTs. citeturn507778view0
Use stable UIDs
Stable UID values help clients understand whether an event is new, updated, or part of a recurring series.
Keep descriptions plain and reliable
Use full HTTPS links and avoid stuffing the description with fragile markup or tokens that break when copied.
Best practices for timed ICS events
Use explicit timezone strategy
Pick one of these two approaches and stay consistent:
- UTC timestamps like
20260425T150000Z - local times with a timezone identifier like
TZID=Africa/Johannesburg
Always include an end time for meetings
A meeting with no DTEND can behave in ways users do not expect.
Test recurring series across DST boundaries
This matters for recurring webinars, classes, and weekly meetings.
Include location or meeting URL
Do not make users hunt for the actual join link after import.
A practical implementation framework
Use all-day if the promise is “this date matters”
Examples:
- holiday
- birthday
- office closure
- launch day reminder
- deadline day
Use timed if the promise is “be here at this time”
Examples:
- webinar at 3 PM
- meeting at 10 AM
- consultation at 1:30 PM
- dinner reservation at 7 PM
This sounds simple, but teams break it when they generate ICS from a generic event model that does not clearly separate all-day and timed logic.
Example: one model, two correct outputs
Correct all-day version
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Elysiate//ICS File Generator//EN
BEGIN:VEVENT
UID:launch-day-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART;VALUE=DATE:20260425
SUMMARY:Launch Day
TRANSP:TRANSPARENT
END:VEVENT
END:VCALENDAR
Correct timed version
BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//Elysiate//ICS File Generator//EN
BEGIN:VEVENT
UID:launch-live-20260425@example.com
DTSTAMP:20260411T120000Z
DTSTART;TZID=Africa/Johannesburg:20260425T180000
DTEND;TZID=Africa/Johannesburg:20260425T190000
SUMMARY:Live Launch Event
LOCATION:https://example.com/live
DESCRIPTION:Join the live release event.
END:VEVENT
END:VCALENDAR
Both may refer to the same broader campaign, but they are not the same event semantics.
Debug checklist for ICS event-type bugs
When a client says the event looks wrong, check these first:
- Is the event supposed to be all-day or timed?
- Does
DTSTARTuseVALUE=DATEorDATE-TIME? - If it is all-day, is
DTENDomitted or set to the day after the final visible day? - If it is timed, is the timezone strategy consistent?
- Was UTC used where local wall-clock time was intended?
- Was the file tested in Outlook, Google Calendar, and Apple Calendar?
- Is the issue on import, subscription, or display after sync?
This checklist catches most production mistakes quickly.
Which workflow to use on Elysiate
Use the ICS File Generator when you need a direct downloadable event file.
Use the Calendar Invite Generator when the main output is an invite-ready file workflow.
Use the Outlook ICS Generator when your audience is explicitly Outlook-heavy and you want a more Outlook-aligned workflow.
Use the Add to Calendar Generator when the experience is page-first and you want a faster user-facing save flow rather than just a downloadable file.
You can also browse the full ICS tools hub.
FAQ
What is the difference between an all-day ICS event and a timed ICS event?
An all-day ICS event uses DATE values like DTSTART;VALUE=DATE:20260425. A timed ICS event uses DATE-TIME values like DTSTART:20260425T150000Z or DTSTART;TZID=Africa/Johannesburg:20260425T170000.
Why does my all-day event show up as two days?
The most common cause is a wrong DTEND value. In ICS, DTEND is non-inclusive, so the end date for a multi-day all-day event must be the day after the last visible day. citeturn507778view0turn507778view1
Should I use midnight UTC for all-day events?
Usually no. A real all-day event should generally be modeled as a DATE event, not as a timed midnight UTC event, because UTC midnight can shift when viewed in other time zones. citeturn507778view0turn507778view1
Can Outlook import ICS files?
Yes. Microsoft documents that Outlook can import events from .ics files and can also subscribe to internet calendars. citeturn426980view1
Can Google Calendar import ICS files?
Yes. Google Calendar supports importing .ics files on desktop through the Import & Export settings. citeturn426980view2
Can Apple Calendar import ICS files?
Yes. Apple Calendar on Mac supports importing events from .ics files and exporting calendars as .ics files. citeturn426980view3
Final takeaway
The biggest mistake teams make with ICS is assuming all-day events are just timed events without a meaningful time. In the standard, they are different data models.
If the event is about a day, use DATE. If the event is about a time, use DATE-TIME. Keep DTEND non-inclusive, be deliberate about time zones, and test your files in the clients your users actually use.
That is what keeps a calendar workflow from becoming a support ticket.
About the author
Elysiate publishes practical guides and privacy-first tools for data workflows, developer tooling, SEO, and product engineering.