diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java index 51cb64d5a2..70a0b91dbd 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/PreparedStatement.java @@ -312,10 +312,9 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta */ public void setDate(int parameterIndex, java.sql.Date x) throws SQLException { - SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''"); - + SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''"); set(parameterIndex, df.format(x)); - + // The above is how the date should be handled. // // However, in JDK's prior to 1.1.6 (confirmed with the @@ -350,8 +349,12 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta * @exception SQLException if a database access error occurs */ public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException - { - set(parameterIndex, "'" + x.toString() + "'"); + { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("GMT")); + StringBuffer strBuf = new StringBuffer("'"); + strBuf.append(df.format(x)).append('.').append(x.getNanos()/10000000).append("+00'"); + set(parameterIndex, strBuf.toString()); } /** diff --git a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java index 3010ed59a3..8bdb67cb28 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc1/ResultSet.java @@ -462,25 +462,49 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu String s = getString(columnIndex); if(s==null) return null; - - // This works, but it's commented out because Michael Stephenson's - // solution is better still: - //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); - - // Michael Stephenson's solution: - SimpleDateFormat df = null; - if (s.length()>21 && s.indexOf('.') != -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz"); - } else if (s.length()>19 && s.indexOf('.') == -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz"); - } else if (s.length()>19 && s.indexOf('.') != -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS"); - } else if (s.length()>10 && s.length()<=18) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss"); + + boolean subsecond; + //if string contains a '.' we have fractional seconds + if (s.indexOf('.') == -1) { + subsecond = false; } else { - df = new SimpleDateFormat("yyyy-MM-dd"); + subsecond = true; } - + + //here we are modifying the string from ISO format to a format java can understand + //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format + //and java expects three digits if fractional seconds are present instead of two for postgres + //so this code strips off timezone info and adds on the GMT+/-... + //as well as adds a third digit for partial seconds if necessary + StringBuffer strBuf = new StringBuffer(s); + char sub = strBuf.charAt(strBuf.length()-3); + if (sub == '+' || sub == '-') { + strBuf.setLength(strBuf.length()-3); + if (subsecond) { + strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00"); + } else { + strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00"); + } + } else if (subsecond) { + strBuf = strBuf.append('0'); + } + + s = strBuf.toString(); + + SimpleDateFormat df = null; + + if (s.length()>23 && subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz"); + } else if (s.length()>23 && !subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz"); + } else if (s.length()>10 && subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } else if (s.length()>10 && !subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + } else { + df = new SimpleDateFormat("yyyy-MM-dd"); + } + try { return new Timestamp(df.parse(s).getTime()); } catch(ParseException e) { diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java index 1e8ec1138e..e2b7b4f8a1 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/PreparedStatement.java @@ -312,10 +312,10 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta */ public void setDate(int parameterIndex, java.sql.Date x) throws SQLException { - SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''"); - + SimpleDateFormat df = new SimpleDateFormat("''yyyy-MM-dd''"); + set(parameterIndex, df.format(x)); - + // The above is how the date should be handled. // // However, in JDK's prior to 1.1.6 (confirmed with the @@ -350,8 +350,12 @@ public class PreparedStatement extends Statement implements java.sql.PreparedSta * @exception SQLException if a database access error occurs */ public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException - { - set(parameterIndex, "'" + x.toString() + "'"); + { + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + df.setTimeZone(TimeZone.getTimeZone("GMT")); + StringBuffer strBuf = new StringBuffer("'"); + strBuf.append(df.format(x)).append('.').append(x.getNanos()/10000000).append("+00'"); + set(parameterIndex, strBuf.toString()); } /** diff --git a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java index 76df78c248..59aef99ad5 100644 --- a/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java +++ b/src/interfaces/jdbc/org/postgresql/jdbc2/ResultSet.java @@ -468,33 +468,46 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu if(s==null) return null; - // This works, but it's commented out because Michael Stephenson's - // solution is better still: - //SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); -// Modification by Jan Thomae - String sub = s.substring(s.length() - 3, s.length()-2); - if (sub.equals("+") || sub.equals("-")) { - s = s.substring(0, s.length()-3) + "GMT"+ s.substring(s.length()-3, s.length())+":00"; + boolean subsecond; + //if string contains a '.' we have fractional seconds + if (s.indexOf('.') == -1) { + subsecond = false; + } else { + subsecond = true; } -// ------- - // Michael Stephenson's solution: + + //here we are modifying the string from ISO format to a format java can understand + //java expects timezone info as 'GMT-08:00' instead of '-08' in postgres ISO format + //and java expects three digits if fractional seconds are present instead of two for postgres + //so this code strips off timezone info and adds on the GMT+/-... + //as well as adds a third digit for partial seconds if necessary + StringBuffer strBuf = new StringBuffer(s); + char sub = strBuf.charAt(strBuf.length()-3); + if (sub == '+' || sub == '-') { + strBuf.setLength(strBuf.length()-3); + if (subsecond) { + strBuf = strBuf.append('0').append("GMT").append(s.substring(s.length()-3, s.length())).append(":00"); + } else { + strBuf = strBuf.append("GMT").append(s.substring(s.length()-3, s.length())).append(":00"); + } + } else if (subsecond) { + strBuf = strBuf.append('0'); + } + + s = strBuf.toString(); + SimpleDateFormat df = null; -// Modification by Jan Thomae - if (s.length()>27) { - df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz"); - } else -// ------- - if (s.length()>21 && s.indexOf('.') != -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSzzz"); - } else if (s.length()>19 && s.indexOf('.') == -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:sszzz"); - } else if (s.length()>19 && s.indexOf('.') != -1) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss.SS"); - } else if (s.length()>10 && s.length()<=18) { - df = new SimpleDateFormat("yyyy-MM-dd HH:MM:ss"); + if (s.length()>23 && subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSSzzzzzzzzz"); + } else if (s.length()>23 && !subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:sszzzzzzzzz"); + } else if (s.length()>10 && subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + } else if (s.length()>10 && !subsecond) { + df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); } else { - df = new SimpleDateFormat("yyyy-MM-dd"); + df = new SimpleDateFormat("yyyy-MM-dd"); } try { @@ -504,6 +517,7 @@ public class ResultSet extends org.postgresql.ResultSet implements java.sql.Resu } } + /** * A column value can be retrieved as a stream of ASCII characters * and then read in chunks from the stream. This method is