code: public static Calendar[] split(final Calendar calendar) {
          // if calendar contains one component or less, or is composed entirely of timezone
          // definitions, return the original calendar unmodified..
          if (calendar.getComponents().size() <= 1
                  || calendar.getComponents(Component.VTIMEZONE).size() == calendar.getComponents().size()) {
              return new Calendar[] {calendar};
          }
          
          final ComponentList<VTimeZone> timezoneList = calendar.getComponents(Component.VTIMEZONE);
  		final IndexedComponentList<VTimeZone> timezones = new IndexedComponentList<VTimeZone>(
          		timezoneList, Property.TZID);
          
          final Map<Uid, Calendar> calendars = new HashMap<Uid, Calendar>();
          for (final CalendarComponent c : calendar.getComponents()) {
              if (c instanceof VTimeZone) {
                  continue;
              }
              
              final Uid uid = c.getProperty(Property.UID);
              
              Calendar uidCal = calendars.get(uid);
              if (uidCal == null) {
                  uidCal = new Calendar(calendar.getProperties(), new ComponentList<CalendarComponent>());
                  // remove METHOD property for split calendars..
                  for (final Property mp : uidCal.getProperties(Property.METHOD)) {
                      uidCal.getProperties().remove(mp);
                  }
                  calendars.put(uid, uidCal);
              }
              
              for (final Property p : c.getProperties()) {
                  final TzId tzid = p.getParameter(Parameter.TZID);
                  if (tzid != null) {
                      final VTimeZone timezone = timezones.getComponent(tzid.getValue());
                      if (!uidCal.getComponents().contains(timezone)) {
                          uidCal.getComponents().add(timezone);
                      }
                  }
              }
              uidCal.getComponents().add(c);
          }
          return calendars.values().toArray(new Calendar[0]);
      }
docs: Splits a calendar object into distinct calendar objects for unique
  identifers (UID).
  @param calendar a calendar instance
  @return an array of calendar objects