private static IRecurrence getRecurrenceForDay(
     int dayOfWeek, StartSpec startSpec, TimeRange timeRange, ICalTimeZone tz, TimeZoneMap tzmap)
     throws ServiceException {
   // DTSTART
   String dateStr = startSpec.getDateString(dayOfWeek);
   String dtStartStr;
   if (tz.sameAsUTC())
     dtStartStr =
         String.format("%sT%02d%02d00Z", dateStr, timeRange.start.hour, timeRange.start.minute);
   else
     dtStartStr =
         String.format(
             "TZID=\"%s\":%sT%02d%02d00",
             tz.getID(), dateStr, timeRange.start.hour, timeRange.start.minute);
   ParsedDateTime dtStart;
   try {
     dtStart = ParsedDateTime.parse(dtStartStr, tzmap);
   } catch (ParseException e) {
     throw ServiceException.INVALID_REQUEST("Bad date/time value \"" + dtStartStr + "\"", e);
   }
   // DURATION
   ParsedDuration dur = timeRange.getDuration();
   // RRULE
   String dayName = DayOfWeekName.lookup(dayOfWeek);
   String ruleStr = String.format("FREQ=WEEKLY;INTERVAL=1;BYDAY=%s", dayName);
   return new Recurrence.SimpleRepeatingRule(dtStart, dur, new ZRecur(ruleStr, tzmap), null);
 }