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)
======================================================================
- duplicates
-
JDK-8058230 Improve java.sql toString formatting
-
- Resolved
-
- relates to
-
JDK-8058230 Improve java.sql toString formatting
-
- Resolved
-