From e8daba3deffda516ddb1021c63333d3be152127d Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 11 Nov 2003 01:09:46 +0000 Subject: 2003-11-10 Gary Benson * java/sql/Timestamp.java (valueOf): Correctly handle nanoseconds. --- java/sql/Timestamp.java | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) (limited to 'java/sql') diff --git a/java/sql/Timestamp.java b/java/sql/Timestamp.java index be0aa4dcd..5ec75da61 100644 --- a/java/sql/Timestamp.java +++ b/java/sql/Timestamp.java @@ -58,11 +58,7 @@ public class Timestamp extends java.util.Date /** * Used for parsing and formatting this date. */ - // Millisecond will have to be close enough for now. - private static SimpleDateFormat parse_sdf = - new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSS"); - - private static SimpleDateFormat format_sdf = + private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); /** @@ -79,14 +75,35 @@ public class Timestamp extends java.util.Date */ public static Timestamp valueOf(String str) { + int nanos = 0; + int dot = str.indexOf('.'); + if (dot != -1) + { + if (str.lastIndexOf('.') != dot) + throw new IllegalArgumentException(str); + + int len = str.length() - dot - 1; + if (len < 1 || len > 9) + throw new IllegalArgumentException(str); + + nanos = Integer.parseInt(str.substring(dot + 1)); + for (int i = len; i < 9; i++) + nanos *= 10; + + str = str.substring(0, dot); + + } + try { - java.util.Date d = (java.util.Date)parse_sdf.parseObject(str); + java.util.Date d = (java.util.Date)sdf.parseObject(str); if (d == null) throw new IllegalArgumentException(str); - else - return new Timestamp(d.getTime()); + + Timestamp ts = new Timestamp(d.getTime() + nanos / 1000000); + ts.nanos = nanos; + return ts; } catch (ParseException e) { @@ -133,7 +150,7 @@ public class Timestamp extends java.util.Date */ public String toString() { - return format_sdf.format(this) + "." + getNanos(); + return sdf.format(this) + "." + getNanos(); } /** -- cgit v1.2.1