code: func parseStart(start string) (*periodicStart, error) {
  	ps := &periodicStart{}
  	ps.dayOfWeek = -1
  	f := strings.Fields(start)
  
  	switch len(f) {
  	case 1: // no day provided
  	case 2:
  		if dow, ok := weekdays[strings.ToLower(f[0])]; ok {
  			ps.dayOfWeek = dow
  		} else {
  			return nil, fmt.Errorf("invalid day of week %q", f[0])
  		}
  		// shift
  		f = f[1:]
  	default:
  		return nil, fmt.Errorf("wrong number of fields")
  	}
  
  	n, err := fmt.Sscanf(f[0], "%d:%d", &ps.hourOfDay, &ps.minuteOfHour)
  
  	// check Sscanf failure
  	if n != 2 || err != nil {
  		return nil, fmt.Errorf("invalid time of day %q: %v", f[0], err)
  	}
  
  	// check hour range
  	if ps.hourOfDay < 0 || ps.hourOfDay > 23 {
  		return nil, fmt.Errorf("invalid time of day %q: hour must be >= 0 and <= 23", f[0])
  	}
  
  	// check minute range
  	if ps.minuteOfHour < 0 || ps.minuteOfHour > 59 {
  		return nil, fmt.Errorf("invalid time of day %q: minute must be >= 0 and <= 59", f[0])
  	}
  
  	return ps, nil
  }
docs: // parseStart parses a string into a periodicStart.