public static boolean isTimeString(final String timeStr) throws InvalidArgumentException {
		List<NameValuePair<CharType, String>> tokens = TextUtilities.extractStringTokens(timeStr, true);
		if (tokens.size() % 2 != 0 || tokens.size() > TIME_VALUES.size() * 2) throw new IllegalArgumentException(TextUtilities.formatArguments(INVALID_STRING,
				1, new String[] { timeStr }));

		for (int i = 0; i < tokens.size(); i += 2) {
			if (tokens.get(i).getKey() != CharType.NUMERIC) throw new InvalidArgumentException(TextUtilities.formatArguments(INVALID_STRING, 1,
					new String[] { timeStr }));

			NameValuePair<CharType, String> entry = tokens.get(i + 1);
			if (entry.getKey() != CharType.CHARACTER || !TIME_VALUES.containsKey(entry.getValue())) throw new IllegalArgumentException(
					TextUtilities.formatArguments(INVALID_STRING, 1, new String[] { timeStr }));
		}

		return true;
	}