Daylight Safing Problem 2004-10-31 00:00:00 (UTC) - Mailing list pgsql-jdbc

From matthias.malsy@sme.de
Subject Daylight Safing Problem 2004-10-31 00:00:00 (UTC)
Date
Msg-id 22997.193.128.157.68.1108396149.squirrel@morpheus.sme.de
Whole thread Raw
Responses Re: Daylight Safing Problem 2004-10-31 00:00:00 (UTC)
List pgsql-jdbc
Dear pgjdbc users and developers,

hope you can help me fixing my daylight safing problem.

Thx in advance

Matthias


Description:
------------
I reduced my problem to a simple testcase just storing and loading a date
from the database. The tescase fails for the time interval of
2004-10-31 00:00:00 to 01:00:00 (UTC). In order to stay ANSI conform,
I use the 'timestamp [without timezone]' data type.
- create table mdso_demo (id int, d timestamp)

Scenario:
---------
I am storing sales data (containing sales date/time) in a database by
ignoring the timezone in order to make it comparable across multiple
timezones. The sales date is deliverd by a foreign system as a String
and is parsed by an UTC-SimpleDateFormatter. After safing and loading,
the date (and its milliseconds) differs by 1 hour.

Output (running on CET/CEST):
-----------------------------
-- Date parsed and stored (running on CET/CEST) -----------
Sun Oct 31 02:00:00 CEST 2004
1099180800000
31 Oct 2004 00:00:00 GMT

-- Date loaded from database
Sun Oct 31 02:00:00 CET 2004
1099184400000
31 Oct 2004 01:00:00 GMT


Environment:
------------
PG:  PostgreSQL 7.4.6 on i686-pc-linux-gnu, compiled by GCC gcc (GCC)
3.3.4 (pre 3.3.5 20040809)
JDBC: pg74.215.jdbc3.jar
JAVA: java version "1.4.2_06"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_06-b03)
      Java HotSpot(TM) Client VM (build 1.4.2_06-b03, mixed mode)
Database _and_ Client are running at CET/CEST.


The Code:
---------
   public void testDaylightSavings3() throws Exception {
        String database = "bkgrsta_dev";
        String username ="mat";
        String password = "";

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
        TimeZone tzGMT = TimeZone.getTimeZone("etc/UTC");
        sdf.setTimeZone( tzGMT );
        Date testDate = sdf.parse("2004-10-31 00:00:00");

        System.out.println("---------------- A Date -----------");
        System.out.println(testDate);
        System.out.println(testDate.getTime());
        System.out.println(testDate.toGMTString());

        Class.forName("org.postgresql.Driver"); //load the driver
        Connection db =
DriverManager.getConnection("jdbc:postgresql:"+database,
                                         username,
                                         password); //connect to the db
        Statement sql = db.createStatement(); //create a statement that we
can use later



        String sqlText = "create table mdso_demo (id int, d timestamp)";
        sql.executeUpdate(sqlText);

        Timestamp ts = new Timestamp(testDate.getTime());
        System.out.println("---------------- Converted to a Timestamp
----------------");
        System.out.println(ts);
        System.out.println(ts.getTime());
           System.out.println(ts.toGMTString());

        sqlText = "insert into mdso_demo values (?,?)";
        PreparedStatement ps = db.prepareStatement(sqlText);
        ps.setInt(1,1);
        ps.setTimestamp(2,ts);
        ps.execute();
        System.out.println("----------------- Date has been inserted into
the database ----------");
        Statement st = db.createStatement();
        ResultSet rs = st.executeQuery("select id, d from mdso_demo");
        boolean b = rs.next();
        Timestamp resTime = rs.getTimestamp(2);

        System.out.println("--------------- Timestamp loaded from database
-----------");
        System.out.println(resTime);
        System.out.println(resTime.getTime());
        System.out.println(resTime.toGMTString());

        Date resDate = new Date(resTime.getTime());
        System.out.println("--------------- Converted to a date
-----------------");
        System.out.println(resDate);
        System.out.println(resDate.getTime());
        System.out.println(resDate.toGMTString());

        long diff = resDate.getTime() - testDate.getTime();
        System.out.println("----------- difference was
-------------------------  ");
        System.out.println("ms: "+ diff + "     h:" + diff /(1000*60*60));
        rs.close();

        sqlText ="drop table mdso_demo";
        sql.execute(sqlText);

        db.close();
    }


pgsql-jdbc by date:

Previous
From: "Xavier Poinsard"
Date:
Subject: Re: Patch adding name for NotImplemented
Next
From: Oliver Jowett
Date:
Subject: Re: Daylight Safing Problem 2004-10-31 00:00:00 (UTC)