code: public static long
  parse(String s, boolean clamp) {
  	if (s == null || s.length() == 0 || !Character.isDigit(s.charAt(0)))
  		throw new NumberFormatException();
  	long value = 0;
  	long ttl = 0;
  	for (int i = 0; i < s.length(); i++) {
  		char c = s.charAt(i);
  		long oldvalue = value;
  		if (Character.isDigit(c)) {
  			value = (value * 10) + Character.getNumericValue(c);
  			if (value < oldvalue)
  				throw new NumberFormatException();
  		} else {
  			switch (Character.toUpperCase(c)) {
  				case 'W': value *= 7;
  				case 'D': value *= 24;
  				case 'H': value *= 60;
  				case 'M': value *= 60;
  				case 'S': break;
  				default:  throw new NumberFormatException();
  			}
  			ttl += value;
  			value = 0;
  			if (ttl > 0xFFFFFFFFL)
  				throw new NumberFormatException();
  		}
  	}
  	if (ttl == 0)
  		ttl = value;
  
  	if (ttl > 0xFFFFFFFFL)
  		throw new NumberFormatException();
  	else if (ttl > MAX_VALUE && clamp)
  		ttl = MAX_VALUE;
  	return ttl;
  }
docs: Parses a TTL-like value, which can either be expressed as a number or a
  BIND-style string with numbers and units.
  @param s The string representing the numeric value.
  @param clamp Whether to clamp values in the range [MAX_VALUE + 1, 2^32 -1]
  to MAX_VALUE.  This should be donw for TTLs, but not other values which
  can be expressed in this format.
  @return The value as a number of seconds
  @throws NumberFormatException The string was not in a valid TTL format.