Program: 66380
Project: 66380
Buggy source:
/** 
 * This method returns a string representing a given java.util.Date based on a given schema type QName. BC dates (sourceDate.getTime() < YEAR_ONE_AD_TIME) are handled as follows: '2007 BC' --> '-2006 AD'.
 * @param sourceDate
 * @param schemaType
 * @return
 */
public String stringFromDate(java.util.Date sourceDate,QName schemaType){
  XMLGregorianCalendar xgc=getDatatypeFactory().newXMLGregorianCalendar();
  if (XMLConstants.DATE_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setDay(cal.get(Calendar.DAY_OF_MONTH));
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    return xgc.toXMLFormat();
  }
  if (XMLConstants.TIME_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setHour(cal.get(Calendar.HOUR_OF_DAY));
    xgc.setMinute(cal.get(Calendar.MINUTE));
    xgc.setSecond(cal.get(Calendar.SECOND));
    String string=xgc.toXMLFormat();
    string=appendMillis(string,sourceDate.getTime());
    return appendTimeZone(string);
  }
  if (XMLConstants.G_DAY_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setDay(cal.get(Calendar.DATE));
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_MONTH_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    String xmlFormat=xgc.toXMLFormat();
    if (xmlFormat.length() == 6) {
      xmlFormat=xmlFormat.substring(0,4);
    }
    return xmlFormat;
  }
  if (XMLConstants.G_MONTH_DAY_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    xgc.setDay(cal.get(Calendar.DAY_OF_MONTH));
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_YEAR_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_YEAR_MONTH_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    return xgc.toXMLFormat();
  }
  if (XMLConstants.DURATION_QNAME.equals(schemaType)) {
    throw new IllegalArgumentException();
  }
  GregorianCalendar cal=new GregorianCalendar(getTimeZone());
  cal.setGregorianChange(new Date(Long.MIN_VALUE));
  cal.setTime(sourceDate);
  xgc=getDatatypeFactory().newXMLGregorianCalendar(cal);
  if (!isTimeZoneQualified()) {
    xgc.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
  }
  String string=xgc.toXMLFormat();
  return truncateMillis(string);
}

Fixed version (ground truth):
/** 
 * This method returns a string representing a given java.util.Date based on a given schema type QName. BC dates (sourceDate.getTime() < YEAR_ONE_AD_TIME) are handled as follows: '2007 BC' --> '-2006 AD'.
 * @param sourceDate
 * @param schemaType
 * @return
 */
public String stringFromDate(java.util.Date sourceDate,QName schemaType){
  XMLGregorianCalendar xgc=getDatatypeFactory().newXMLGregorianCalendar();
  if (XMLConstants.DATE_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setDay(cal.get(Calendar.DAY_OF_MONTH));
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    return xgc.toXMLFormat();
  }
  if (XMLConstants.TIME_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setHour(cal.get(Calendar.HOUR_OF_DAY));
    xgc.setMinute(cal.get(Calendar.MINUTE));
    xgc.setSecond(cal.get(Calendar.SECOND));
    String string=xgc.toXMLFormat();
    string=appendMillis(string,sourceDate.getTime());
    return appendTimeZone(string,sourceDate);
  }
  if (XMLConstants.G_DAY_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setDay(cal.get(Calendar.DATE));
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_MONTH_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    String xmlFormat=xgc.toXMLFormat();
    if (xmlFormat.length() == 6) {
      xmlFormat=xmlFormat.substring(0,4);
    }
    return xmlFormat;
  }
  if (XMLConstants.G_MONTH_DAY_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    xgc.setDay(cal.get(Calendar.DAY_OF_MONTH));
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_YEAR_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    return xgc.toXMLFormat();
  }
  if (XMLConstants.G_YEAR_MONTH_QNAME.equals(schemaType)) {
    GregorianCalendar cal=new GregorianCalendar(getTimeZone());
    cal.setGregorianChange(new Date(Long.MIN_VALUE));
    cal.setTime(sourceDate);
    if (cal.get(Calendar.ERA) == GregorianCalendar.BC) {
      xgc.setYear(-cal.get(Calendar.YEAR));
    }
 else {
      xgc.setYear(cal.get(Calendar.YEAR));
    }
    xgc.setMonth(cal.get(Calendar.MONTH) + 1);
    return xgc.toXMLFormat();
  }
  if (XMLConstants.DURATION_QNAME.equals(schemaType)) {
    throw new IllegalArgumentException();
  }
  GregorianCalendar cal=new GregorianCalendar(getTimeZone());
  cal.setGregorianChange(new Date(Long.MIN_VALUE));
  cal.setTime(sourceDate);
  xgc=getDatatypeFactory().newXMLGregorianCalendar(cal);
  if (!isTimeZoneQualified()) {
    xgc.setTimezone(DatatypeConstants.FIELD_UNDEFINED);
  }
  String string=xgc.toXMLFormat();
  return truncateMillis(string);
}