Skip to main content
5 min read
•By Chieyine Nelson•Published August 15, 2026

Convert a CSV Event List to ICS Without Shifting the Times

Prepare spreadsheet events for calendar import, handle dates and time zones safely, and check the ICS file before adding it to Google, Outlook, or Apple Calendar.

A spreadsheet is convenient for planning dozens of events. A calendar is better at reminders, invitations, and day-to-day scheduling. An ICS file bridges the two, but only when the source dates are unambiguous.

The dangerous failure is a quiet one: the file imports successfully and every meeting appears one hour, several hours, or an entire day away from where you expected it. That usually begins with an unclear date, a missing time zone, or an all-day event treated as a timed event.

Start with a clean event table

Use one row per event. At minimum, include a title and start date. End time, location, description, and a stable event ID are useful when available.

event_id,title,start,end,location,description
training-001,Data quality workshop,2026-09-03 09:00,2026-09-03 12:30,Conference Room 2,Bring a laptop
training-002,Quarterly review,2026-09-05 14:00,2026-09-05 15:00,Online,Review Q3 indicators

Prefer four-digit years and a consistent year-month-day order. A value such as 03/09/2026 may mean 3 September or March 9, depending on the software and regional settings.

Before conversion, decide:

  • whether the times are local, UTC, or already include an offset;
  • whether an event is timed or all-day;
  • what should happen when the end is missing;
  • whether identical rows represent duplicates; and
  • which column will supply a stable identifier.

Convert the CSV in HappyCSV

Open CSV to ICS, select the file, and map the title and start columns. Map the optional end, location, and description columns only when they contain the expected values.

HappyCSV creates an iCalendar file in your browser. Downloading the file does not connect to your calendar or publish the events. You decide when and where to import it.

The resulting file contains a VEVENT for each accepted row. A simplified event looks like this:

BEGIN:VEVENT
UID:training-001@example.invalid
DTSTART:20260903T090000
DTEND:20260903T123000
SUMMARY:Data quality workshop
LOCATION:Conference Room 2
DESCRIPTION:Bring a laptop
END:VEVENT

ICS is formally called iCalendar and is defined by RFC 5545. Google Calendar, Microsoft Outlook, and Apple Calendar all understand the core format, although their import interfaces and treatment of optional fields differ.

Time zones require an explicit decision

An ICS date-time can represent UTC, local time tied to a named time zone, or a “floating” time with no zone attached.

UTC values end with Z:

DTSTART:20260903T080000Z

That is 08:00 UTC. A calendar in Lagos would normally display it as 09:00 West Africa Time.

A floating value has no Z and no TZID:

DTSTART:20260903T090000

Calendar applications commonly interpret a floating time in the importing calendar's local zone. That may be appropriate for a personal schedule prepared and imported in one location. It is risky when recipients work across countries.

If the source CSV does not record a time zone, a converter cannot recover it from the clock time alone. Confirm the generated file's behaviour with one test event before importing hundreds.

All-day events are dates, not midnight meetings

An all-day event should use a date value:

DTSTART;VALUE=DATE:20260903
DTEND;VALUE=DATE:20260904

For an all-day event, DTEND is exclusive. The end date above means the event covers 3 September and stops when 4 September begins. A three-day event from 3 through 5 September would end on 6 September.

Encoding an all-day event as 00:00 to 23:59 can produce awkward displays and time-zone shifts. Use a converter that supports all-day semantics, or verify the output before import.

Descriptions and locations may contain special characters

Commas, semicolons, backslashes, and line breaks have escaping rules in iCalendar text. Do not build ICS records by simply joining CSV values with labels.

A description containing a comma or a new line must be escaped correctly. Long content lines may also need to be folded according to the format. HappyCSV handles the file construction, but unusual content still deserves a test in the destination calendar.

Prevent duplicate events

Importing the same ICS file twice can create duplicates. Calendar products do not all deduplicate imported events in the same way.

The UID field identifies an event. If you regenerate a file, stable source IDs make stable UIDs possible. Row numbers are poor identifiers because inserting a new row changes every number after it.

Use an event code from the source system where possible. If there is none, create one and keep it with the spreadsheet.

Check the file before a full import

Create a copy or a temporary calendar and import a small sample first. Check:

  1. one morning event and one afternoon event;
  2. an event with an explicit end time;
  3. an all-day event, if present;
  4. punctuation and line breaks in descriptions;
  5. non-ASCII names and locations;
  6. the displayed time zone; and
  7. whether importing the sample twice creates duplicates.

Also compare the number of generated events with the number of source rows. Blank titles, invalid dates, or malformed rows should be resolved rather than silently ignored.

Importing is different from synchronising

An ICS import is a snapshot. Editing the original spreadsheet later will not update events already imported. A calendar subscription or API integration is required for ongoing synchronisation.

For a one-off training schedule, conference programme, duty roster, or migration, a reviewed ICS file is often exactly what you need. Keep the source CSV and record the time-zone assumption so the process can be repeated without guesswork.

Use the CSV to ICS

Convert event rows into an ICS calendar file for Google Calendar, Outlook, Apple Calendar, and iPhone. Your file is processed locally in the browser.