Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-4808842

Make java.sql.Timestamp#toString() as fast as java.sql.Date#toString()

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Duplicate
    • Icon: P4 P4
    • None
    • 1.4.0
    • core-libs
    • x86
    • windows_2000



      Name: jl125535 Date: 01/27/2003


      FULL PRODUCT VERSION :
      java version "1.4.0"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
      Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)

      A DESCRIPTION OF THE PROBLEM :
      java.sql.Timestamp toString() was evidently missed when
      java.sql.Date was upgraded to use more efficient
      technology. The suggested enhancement below upgrades
      toString() and takes it to the next level of technology
      that suggested for java.sql.Date and java.sql.Time (see bugs
      4808825 and 4808829). We use alot of Timestamps here so this
      upgrade is a good win for us in terms of database
      operations and JVM efficiency. I've taken this enhancement
      to the next level beyond my java.sql.Date and java.swl.Time
      enhancements to toString() by eliminating the calls to
      Character.getDigit(int,int). I think I've now got this as
      lean as it can get.

      REPRODUCIBILITY :
      This bug can be reproduced always.

      ---------- BEGIN SOURCE ----------
      Current source code:
          public String toString () {

      int year = super.getYear() + 1900;
      int month = super.getMonth() + 1;
      int day = super.getDate();
      int hour = super.getHours();
      int minute = super.getMinutes();
      int second = super.getSeconds();
      String yearString;
      String monthString;
      String dayString;
      String hourString;
      String minuteString;
      String secondString;
      String nanosString;
      String zeros = "000000000";
      String yearZeros = "0000";
      StringBuffer timestampBuf;

      if (year < 1000) {
      // Add leading zeros
      yearString = "" + year;
      yearString = yearZeros.substring(0, (4-yearString.length())) +
      yearString;
      } else {
      yearString = "" + year;
      }
      if (month < 10) {
      monthString = "0" + month;
      } else {
      monthString = Integer.toString(month);
      }
      if (day < 10) {
      dayString = "0" + day;
      } else {
      dayString = Integer.toString(day);
      }
      if (hour < 10) {
      hourString = "0" + hour;
      } else {
      hourString = Integer.toString(hour);
      }
      if (minute < 10) {
      minuteString = "0" + minute;
      } else {
      minuteString = Integer.toString(minute);
      }
      if (second < 10) {
      secondString = "0" + second;
      } else {
      secondString = Integer.toString(second);
      }
      if (nanos == 0) {
      nanosString = "0";
      } else {
      nanosString = Integer.toString(nanos);

      // Add leading zeros
      nanosString = zeros.substring(0, (9-nanosString.length())) +
      nanosString;

      // Truncate trailing zeros
      char[] nanosChar = new char[nanosString.length()];
      nanosString.getChars(0, nanosString.length(), nanosChar, 0);
      int truncIndex = 8;
      while (nanosChar[truncIndex] == '0') {
      truncIndex--;
      }

      nanosString = new String(nanosChar, 0, truncIndex + 1);
      }

      // do a string buffer here instead.
      timestampBuf = new StringBuffer();
      timestampBuf.append(yearString);
      timestampBuf.append("-");
      timestampBuf.append(monthString);
      timestampBuf.append("-");
      timestampBuf.append(dayString);
      timestampBuf.append(" ");
      timestampBuf.append(hourString);
      timestampBuf.append(":");
      timestampBuf.append(minuteString);
      timestampBuf.append(":");
      timestampBuf.append(secondString);
      timestampBuf.append(".");
      timestampBuf.append(nanosString);

      return (timestampBuf.toString());
          }

        Suggested enhancement:
         public String toString () {

      int year = super.getYear() + 1900;
      int month = super.getMonth() + 1;
      int day = super.getDate();
      int hour = super.getHours();
      int minute = super.getMinutes();
      int second = super.getSeconds();

             char buf[] = {
      (char)('0' + (year/1000)),
      (char)('0' + ((year/100)%10)),
      (char)('0' + ((year/10)%10)),
      (char)('0' + (year%10)),
      '-',
      (char)('0' + (month/10)),
      (char)('0' + (month%10)),
      '-',
      (char)('0' + (day/10)),
      (char)('0' + (day%10)),
      ' ',
      (char)('0' + ((hour/10)%10)),
      (char)('0' + (hour%10)),
      ':',
      (char)('0' + (minute/10)),
      (char)('0' + (minute%10)),
      ':',
      (char)('0' + (second/10)),
      (char)('0' + (second%10)),
      '.',
      (char)('0' + ((ourNanos/100000000)%10)),
      (char)('0' + ((ourNanos/10000000)%10)),
      (char)('0' + ((ourNanos/1000000)%10)),
      (char)('0' + ((ourNanos/100000)%10)),
      (char)('0' + ((ourNanos/10000)%10)),
      (char)('0' + ((ourNanos/1000)%10)),
      (char)('0' + ((ourNanos/100)%10)),
      (char)('0' + ((ourNanos/10)%10)),
      (char)('0' + (ourNanos%10))};

      // Strip trailing 0's from nanos
      int endOfNanos = buf.length - 1;
      while (buf[endOfNanos] == '0') {
      endOfNanos--;
      }
      if (buf[endOfNanos] == '.') {
      // leave trailing 0
      endOfNanos++;
      }

      return new String(buf, 0, endOfNanos + 1);
          }

      ---------- END SOURCE ----------
      (Review ID: 153588)
      ======================================================================

            Unassigned Unassigned
            jleesunw Jon Lee (Inactive)
            Votes:
            0 Vote for this issue
            Watchers:
            0 Start watching this issue

              Created:
              Updated:
              Resolved:
              Imported:
              Indexed: