Thread: Strange behaviour of rs.getTimestamp

Strange behaviour of rs.getTimestamp

From
Altaf Malik
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
"Kevin Grittner"
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
Altaf Malik
Date:

> 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

Re: Strange behaviour of rs.getTimestamp

From
"Kevin Grittner"
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
Samuel Gendler
Date:


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. 
 

Re: Strange behaviour of rs.getTimestamp

From
"Kevin Grittner"
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
Altaf Malik
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
Radosław Smogura
Date:
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

Re: Strange behaviour of rs.getTimestamp

From
Radosław Smogura
Date:
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