docs: @Override
  	public <T> T asObject(String string, Class<T> valueType) {
  		if (string.isEmpty()) {
  			return null;
  		}
  
  		// simple date format is not thread safe; on the other hand http request threads are reused
  		// so seems like a good idea to avoid parser instance creation and reuse it on a per thread basis
  		// excerpt from Java api-doc:
  		// Date formats are not synchronized. It is recommended to create separate format instances for each thread.
  		DateFormat df = dateParser.get();
  		if (df == null) {
  			df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
  			df.setTimeZone(TimeZone.getTimeZone("UTC"));
  			dateParser.set(df);
  		}
  
  		ParsePosition parsePosition = new ParsePosition(0);
  		Date date = df.parse(string, parsePosition);
  		if (date == null) {
  			throw new ConverterException("Cannot parse ISO8601 date from |%s| at position |%d|.", string, parsePosition.getErrorIndex());
  		}
  
  		Calendar calendar = Calendar.getInstance();
  		calendar.setTime(date);
  		calendar.set(Calendar.MILLISECOND, 0);
  		long time = calendar.getTimeInMillis();
  
  		if (valueType == Date.class) {
  			return (T) new Date(time);
  		}
  		if (valueType == java.sql.Date.class) {
  			return (T) new java.sql.Date(time);
  		}
  		if (valueType == Time.class) {
  			return (T) new Time(time);
  		}
  		if (valueType == Timestamp.class) {
  			return (T) new Timestamp(time);
  		}
  
  		throw new BugError("Unsupported date type |%s|.", valueType);
  	}