public static Calendar parse(String input) {
        if (input == null || input.isEmpty()) {
            return null;
        }
        
        Calendar result = GregorianCalendar.getInstance();
        for (Entry<String, Pattern> entry : patterns.entrySet()) {
            Matcher m = entry.getValue().matcher(input);
            if (m.matches()) {
                int addTo = Integer.parseInt(m.group(1));
                int field = fields.get(entry.getKey());
                result.add(field, addTo);
                
                // remove found portion otherwise regex is not working... :/
                input = input.replace(m.group(1)+entry.getKey(), "");
            }
        }
        return result;
    }