Thread: Strange behaviour of rs.getTimestamp
Hello everyone,
I am getting a strange behaviour from rs.getTimestamp() with two specific dates. Please consider the following test case.
Statement stmt = con.createStatement();
stmt.executeUpdate("create table ts_test(a timestamp)");
stmt.executeUpdate("insert into ts_test values('15-APR-09');");
ResultSet rs = stmt.executeQuery("select * from ts_test");
while (rs.next()) {
Timestamp t = rs.getTimestamp(1);
System.out.println(rs.getString(1)+"->"+ t);
}
stmt.executeUpdate("drop table ts_test");
If you run this test case, I get : 2009-04-15 00:00:00->2009-04-15 01:00:00.0
Please note the values obtained from rs.getString and rs.getTimestamp are different. I get correct values if I run the same test case against JDK 1.5 (However I have noticed the same behaviour on some of the JDK 1.5's on our network)
This behaviour is for values 15 April 2009 and 1st June 2009. If I change the year or date, it works just fine. It is not because of Daylight Savings settings because on the very next day or the previous day, the value is correct. Is there something needs to be fixed in Driver or it is the JDK causing the problem?
Regards,
Altaf Malik
I am getting a strange behaviour from rs.getTimestamp() with two specific dates. Please consider the following test case.
Statement stmt = con.createStatement();
stmt.executeUpdate("create table ts_test(a timestamp)");
stmt.executeUpdate("insert into ts_test values('15-APR-09');");
ResultSet rs = stmt.executeQuery("select * from ts_test");
while (rs.next()) {
Timestamp t = rs.getTimestamp(1);
System.out.println(rs.getString(1)+"->"+ t);
}
stmt.executeUpdate("drop table ts_test");
If you run this test case, I get : 2009-04-15 00:00:00->2009-04-15 01:00:00.0
Please note the values obtained from rs.getString and rs.getTimestamp are different. I get correct values if I run the same test case against JDK 1.5 (However I have noticed the same behaviour on some of the JDK 1.5's on our network)
This behaviour is for values 15 April 2009 and 1st June 2009. If I change the year or date, it works just fine. It is not because of Daylight Savings settings because on the very next day or the previous day, the value is correct. Is there something needs to be fixed in Driver or it is the JDK causing the problem?
Regards,
Altaf Malik
Altaf Malik <mmalik_altaf@yahoo.com> wrote: > I get correct values if I run the same test case against JDK 1.5 As opposed to what? (You never really told us about the environment in which you're seeing the failure.) > (However I have noticed the same behaviour on some of the JDK > 1.5's on our network) So, what's different between the ones that yield the correct values and the ones that don't? (Obviously you're in a better position to determine that than I am.) You might get some ideas on additional information you could include to get better support from this page: http://wiki.postgresql.org/wiki/Guide_to_reporting_problems If you can put together a self-contained test case that someone can compile and run on their own machine, it becomes much easier for others to understand the problem and to help. -Kevin
> So, what's different between the ones that yield the correct values
> and the ones that don't?
Please look at the values:
2009-04-15 00:00:00->2009-04-15 01:00:00.0
The value I inserted in table was 2009-04-15 00:00:00 and from rs.getString(1) I got the same value. rs.getTimestamp(1) returned me a different value (note the hour value is 1 instead of 0). The value I got is: 2009-04-15 00:00:00
> If you can put together a self-contained test case that someone can
> compile and run on their own machine, it becomes much easier for
> others to understand the problem and to help.
I did so. Please read the following portion carefully:
Statement stmt = con.createStatement();
stmt.executeUpdate("create table ts_test(a timestamp)");
stmt.executeUpdate("insert into ts_test values('15-APR-09');");
ResultSet rs = stmt.executeQuery("select * from ts_test");
while (rs.next()) {
Timestamp t = rs.getTimestamp(1);
System.out.println(rs.getString(1)+"->"+ t);
}
stmt.executeUpdate("drop table ts_test");
Regards,
Altaf Malik
> and the ones that don't?
Please look at the values:
2009-04-15 00:00:00->2009-04-15 01:00:00.0
The value I inserted in table was 2009-04-15 00:00:00 and from rs.getString(1) I got the same value. rs.getTimestamp(1) returned me a different value (note the hour value is 1 instead of 0). The value I got is: 2009-04-15 00:00:00
> If you can put together a self-contained test case that someone can
> compile and run on their own machine, it becomes much easier for
> others to understand the problem and to help.
I did so. Please read the following portion carefully:
Statement stmt = con.createStatement();
stmt.executeUpdate("create table ts_test(a timestamp)");
stmt.executeUpdate("insert into ts_test values('15-APR-09');");
ResultSet rs = stmt.executeQuery("select * from ts_test");
while (rs.next()) {
Timestamp t = rs.getTimestamp(1);
System.out.println(rs.getString(1)+"->"+ t);
}
stmt.executeUpdate("drop table ts_test");
Regards,
Altaf Malik
Altaf Malik <mmalik_altaf@yahoo.com> wrote: >> So, what's different between the ones that yield the correct >> values and the ones that don't? > > Please look at the values: > 2009-04-15 00:00:00->2009-04-15 01:00:00.0 You didn't read very closely -- you said some machines gave the right answer and some the wrong answer. Clearly there's something different from one to the other. What? >> If you can put together a self-contained test case that someone >> can compile and run on their own machine, it becomes much easier >> for others to understand the problem and to help. > > I did so. Please read the following portion carefully: No, that was a code snippet. I fleshed it out to a compilable source file like this: import java.sql.*; public final class TestTS { public static void main(String[] args) throws Exception { Class.forName("org.postgresql.Driver"); Connection con = DriverManager.getConnection ("jdbc:postgresql:test", "test", "test"); Statement stmt = con.createStatement(); stmt.executeUpdate("create table ts_test(a timestamp)"); stmt.executeUpdate ("insert into ts_test values('15-APR-09');"); ResultSet rs = stmt.executeQuery("select * from ts_test"); System.out.println(System.getProperty("java.vendor")); System.out.println(System.getProperty("java.version")); System.out.println(System.getProperty("java.vm.name")); System.out.println(System.getProperty("java.vm.info")); while (rs.next()) { Timestamp t = rs.getTimestamp(1); System.out.println(rs.getString(1)+"->"+ t); } rs.close(); stmt.executeUpdate("drop table ts_test"); stmt.close(); con.close(); } } When I compile and run, I get this: Sun Microsystems Inc. 1.6.0_21 Java HotSpot(TM) Client VM mixed mode, sharing 2009-04-15 00:00:00->2009-04-15 00:00:00.0 Unless you provide more information, nobody can help. -Kevin
On Thu, Jan 6, 2011 at 6:56 AM, Kevin Grittner <Kevin.Grittner@wicourts.gov> wrote:
Unless you provide more information, nobody can help.
It might also be potentially revealing if you print out the default timezone and locale for the jvm in question as well.
Samuel Gendler <sgendler@ideasculptor.com> wrote: > It might also be potentially revealing if you print out the > default timezone and locale for the jvm in question as well. Good point. In addition to the system properties printed from what I posted, please include the "user.timezone" system property. -Kevin
Here is the output of the program run. I also included user.timezone
Sun Microsystems Inc.
1.6.0_21
Java HotSpot(TM) 64-Bit Server VM
mixed mode
TimeZone:Asia/Karachi
2009-04-15 00:00:00->2009-04-15 01:00:00.0
I am using UBUNTU 10.10 64 bit.
I don't see this behaviour with other timezones. For example, I set my TZ to PST, GMT and the values were correct.
I debugged little further and found that the value is changed in the following code:
Calendar c = new GregorianCalendar();
c.set(Calendar.ERA, 1);
c.set(Calendar.YEAR, 2009);
c.set(Calendar.MONTH, 4-1);
c.set(Calendar.DAY_OF_MONTH, 15);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Timestamp ts = new Timestamp(c.getTime().getTime());
In the specific scenario, if you print ts, it shows hour value as 1 only on this specific date. So obviously, something seems wrong with JDK or my timezone data.
My point is, that when we don't want the value interpreted in different timezones (we are using timestamp and not timestamp with timezone), we should not use Calander to convert value to a timestamp when we exactly have year,month,day,hour,minute and second values.
-- Altaf Malik
From: Kevin Grittner <Kevin.Grittner@wicourts.gov>
To: Altaf Malik <mmalik_altaf@yahoo.com>
Cc: Samuel Gendler <sgendler@ideasculptor.com>; pgsql-jdbc@postgresql.org
Sent: Fri, January 7, 2011 2:00:55 AM
Subject: Re: [JDBC] Strange behaviour of rs.getTimestamp
Samuel Gendler <sgendler@ideasculptor.com> wrote:
> It might also be potentially revealing if you print out the
> default timezone and locale for the jvm in question as well.
Good point. In addition to the system properties printed from what
I posted, please include the "user.timezone" system property.
-Kevin
--
Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc
Sun Microsystems Inc.
1.6.0_21
Java HotSpot(TM) 64-Bit Server VM
mixed mode
TimeZone:Asia/Karachi
2009-04-15 00:00:00->2009-04-15 01:00:00.0
I am using UBUNTU 10.10 64 bit.
I don't see this behaviour with other timezones. For example, I set my TZ to PST, GMT and the values were correct.
I debugged little further and found that the value is changed in the following code:
Calendar c = new GregorianCalendar();
c.set(Calendar.ERA, 1);
c.set(Calendar.YEAR, 2009);
c.set(Calendar.MONTH, 4-1);
c.set(Calendar.DAY_OF_MONTH, 15);
c.set(Calendar.HOUR_OF_DAY, 0);
c.set(Calendar.MINUTE, 0);
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
Timestamp ts = new Timestamp(c.getTime().getTime());
In the specific scenario, if you print ts, it shows hour value as 1 only on this specific date. So obviously, something seems wrong with JDK or my timezone data.
My point is, that when we don't want the value interpreted in different timezones (we are using timestamp and not timestamp with timezone), we should not use Calander to convert value to a timestamp when we exactly have year,month,day,hour,minute and second values.
-- Altaf Malik
From: Kevin Grittner <Kevin.Grittner@wicourts.gov>
To: Altaf Malik <mmalik_altaf@yahoo.com>
Cc: Samuel Gendler <sgendler@ideasculptor.com>; pgsql-jdbc@postgresql.org
Sent: Fri, January 7, 2011 2:00:55 AM
Subject: Re: [JDBC] Strange behaviour of rs.getTimestamp
Samuel Gendler <sgendler@ideasculptor.com> wrote:
> It might also be potentially revealing if you print out the
> default timezone and locale for the jvm in question as well.
Good point. In addition to the system properties printed from what
I posted, please include the "user.timezone" system property.
-Kevin
--
Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc
Hi, I think it's DST maybe you missed something. I didn't search deaply. https://bugzilla.redhat.com/show_bug.cgi?id=495473 Did you missed something, about DST? Kind regards, Radosław Smogura http://softperience.eu Altaf Malik <mmalik_altaf@yahoo.com> Friday 07 January 2011 16:31:26 > Here is the output of the program run. I also included user.timezone > > Sun Microsystems Inc. > 1.6.0_21 > Java HotSpot(TM) 64-Bit Server VM > mixed mode > TimeZone:Asia/Karachi > 2009-04-15 00:00:00->2009-04-15 01:00:00.0 > > I am using UBUNTU 10.10 64 bit. > I don't see this behaviour with other timezones. For example, I set my TZ > to PST, GMT and the values were correct. > > > I debugged little further and found that the value is changed in the > following code: > > Calendar c = new GregorianCalendar(); > c.set(Calendar.ERA, 1); > c.set(Calendar.YEAR, 2009); > c.set(Calendar.MONTH, 4-1); > c.set(Calendar.DAY_OF_MONTH, 15); > c.set(Calendar.HOUR_OF_DAY, 0); > c.set(Calendar.MINUTE, 0); > c.set(Calendar.SECOND, 0); > c.set(Calendar.MILLISECOND, 0); > Timestamp ts = new Timestamp(c.getTime().getTime()); > > In the specific scenario, if you print ts, it shows hour value as 1 only > on this specific date. So obviously, something seems wrong with JDK or my > timezone data. > > My point is, that when we don't want the value interpreted in different > timezones (we are using timestamp and not timestamp with timezone), we > should not use Calander to convert value to a timestamp when we exactly > have year,month,day,hour,minute and second values. > > -- Altaf Malik > > > > ________________________________ > From: Kevin Grittner <Kevin.Grittner@wicourts.gov> > To: Altaf Malik <mmalik_altaf@yahoo.com> > Cc: Samuel Gendler <sgendler@ideasculptor.com>; pgsql-jdbc@postgresql.org > Sent: Fri, January 7, 2011 2:00:55 AM > Subject: Re: [JDBC] Strange behaviour of rs.getTimestamp > > Samuel Gendler <sgendler@ideasculptor.com> wrote: > > It might also be potentially revealing if you print out the > > default timezone and locale for the jvm in question as well. > > Good point. In addition to the system properties printed from what > I posted, please include the "user.timezone" system property. > > -Kevin
Sorry, but for P. S. It's quite good response, because, in your timezone, and in all other timezones when DST starts there is no hour and times in your e.g. 2009-14-15 0:00:00 till 2099-14-15 1:00:00. At midnight you add one hour to all clocks. So just after 2009-14-14 23:59:59.9999999. you have 2009-14-15 1:0:0. As you use Timestamps, Java internaly stores time in UTC, and when You cast this to String, then Calendar will rollover such fields to next Value (see setLenient(bool)). Unfortunatly Pakistan Gover, choosed realy bed time for DST, if this would be 1 AM, you have no problem. Radosław Smogura <rsmogura@softperience.eu> Friday 07 January 2011 17:54:51 > Hi, > I think it's DST maybe you missed something. I didn't search deaply. > https://bugzilla.redhat.com/show_bug.cgi?id=495473 > > Did you missed something, about DST? > > Kind regards, > Radosław Smogura > http://softperience.eu > > Altaf Malik <mmalik_altaf@yahoo.com> Friday 07 January 2011 16:31:26 > > > Here is the output of the program run. I also included user.timezone > > > > Sun Microsystems Inc. > > 1.6.0_21 > > Java HotSpot(TM) 64-Bit Server VM > > mixed mode > > TimeZone:Asia/Karachi > > 2009-04-15 00:00:00->2009-04-15 01:00:00.0 > > > > I am using UBUNTU 10.10 64 bit. > > I don't see this behaviour with other timezones. For example, I set my TZ > > to PST, GMT and the values were correct. > > > > > > I debugged little further and found that the value is changed in the > > > > following code: > > Calendar c = new GregorianCalendar(); > > > > c.set(Calendar.ERA, 1); > > c.set(Calendar.YEAR, 2009); > > c.set(Calendar.MONTH, 4-1); > > c.set(Calendar.DAY_OF_MONTH, 15); > > c.set(Calendar.HOUR_OF_DAY, 0); > > c.set(Calendar.MINUTE, 0); > > c.set(Calendar.SECOND, 0); > > > > c.set(Calendar.MILLISECOND, 0); > > > > Timestamp ts = new Timestamp(c.getTime().getTime()); > > > > In the specific scenario, if you print ts, it shows hour value as 1 only > > on this specific date. So obviously, something seems wrong with JDK or > > my timezone data. > > > > My point is, that when we don't want the value interpreted in different > > timezones (we are using timestamp and not timestamp with timezone), we > > should not use Calander to convert value to a timestamp when we exactly > > have year,month,day,hour,minute and second values. > > > > -- Altaf Malik > > > > > > > > ________________________________ > > From: Kevin Grittner <Kevin.Grittner@wicourts.gov> > > To: Altaf Malik <mmalik_altaf@yahoo.com> > > Cc: Samuel Gendler <sgendler@ideasculptor.com>; pgsql-jdbc@postgresql.org > > Sent: Fri, January 7, 2011 2:00:55 AM > > Subject: Re: [JDBC] Strange behaviour of rs.getTimestamp > > > > Samuel Gendler <sgendler@ideasculptor.com> wrote: > > > It might also be potentially revealing if you print out the > > > default timezone and locale for the jvm in question as well. > > > > Good point. In addition to the system properties printed from what > > I posted, please include the "user.timezone" system property. > > > > -Kevin