public Object clone() {
   DateTimeData dt =
       new DateTimeData(
           this.year,
           this.month,
           this.day,
           this.hour,
           this.minute,
           this.second,
           this.utc,
           this.originalValue,
           this.normalized,
           this.type);
   dt.canonical = this.canonical;
   dt.position = position;
   dt.timezoneHr = this.timezoneHr;
   dt.timezoneMin = this.timezoneMin;
   dt.unNormYear = this.unNormYear;
   dt.unNormMonth = this.unNormMonth;
   dt.unNormDay = this.unNormDay;
   dt.unNormHour = this.unNormHour;
   dt.unNormMinute = this.unNormMinute;
   dt.unNormSecond = this.unNormSecond;
   return dt;
 }
  /**
   * Parses, validates and computes normalized version of gYearMonth object
   *
   * @param str The lexical representation of gYearMonth object CCYY-MM with possible time zone Z or
   *     (-),(+)hh:mm
   * @return normalized date representation
   * @exception SchemaDateTimeException Invalid lexical representation
   */
  protected DateTimeData parse(String str) throws SchemaDateTimeException {
    DateTimeData date = new DateTimeData(str, this);
    int len = str.length();

    // get date
    int end = getYearMonth(str, 0, len, date);
    date.day = DAY;
    parseTimeZone(str, end, len, date);

    // validate and normalize

    validateDateTime(date);

    // save unnormalized values
    saveUnnormalized(date);

    if (date.utc != 0 && date.utc != 'Z') {
      normalize(date);
    }
    date.position = 0;
    return date;
  }