Re: Timezone conversion woes

Поиск
Список
Период
Сортировка
От Dave Cramer
Тема Re: Timezone conversion woes
Дата
Msg-id 65B60CEF-5354-485A-9A86-90FDAE897F8F@fastcrypt.com
обсуждение исходный текст
Ответ на Re: Timezone conversion woes  (Christian Cryder <c.s.cryder@gmail.com>)
Список pgsql-jdbc
Christian,

Did you resolve this ?

Without looking at the code, I am thinking that using an absolute
long for the timestamp might
be the problem. I generally create a calendar and get the date I want
out of it ?

Dave
On 15-Jul-05, at 7:04 PM, Christian Cryder wrote:

> And then there's this. If I change my insert code to use dynamically
> generated SQL via Statement, rather than PreparedStatement, like this:
>
>         //insert some sample data
>         t = new Timestamp(1112511962000L);        //2005-04-03
> 00:06:02
>         System.out.println("inserting: "+sdf.format(t)+" (millis:
> "+t.getTime()+")");
>         stmt.executeUpdate("INSERT INTO Foo (TrxTime) VALUES
> ('"+sdf.format(t)+"')");
>         t = new Timestamp(1112520583000L);        //2005-04-03
> 02:29:43
>         System.out.println("inserting: "+sdf.format(t)+" (millis:
> "+t.getTime()+")");
>         stmt.executeUpdate("INSERT INTO Foo (TrxTime) VALUES
> ('"+sdf.format(t)+"')");
>         t = new Timestamp(1112522529000L);        //2005-04-03
> 03:02:09
>         System.out.println("inserting: "+sdf.format(t)+" (millis:
> "+t.getTime()+")");
>         stmt.executeUpdate("INSERT INTO Foo (TrxTime) VALUES
> ('"+sdf.format(t)+"')");
>         if (!conn.getAutoCommit()) conn.commit();
>
> the data goes in correctly (no mungin on the last two dates). I get
> the following output after the inserts...
>
> [UID]:58 [TrxTime]:2005-04-03 00:06:02.000 (millis: 1112511962000)
> [UID]:59 [TrxTime]:2005-04-03 02:29:43.000 (millis: 1112520583000)
> [UID]:60 [TrxTime]:2005-04-03 03:02:09.000 (millis: 1112522529000)
>
> So it appears to me there is a bug, either in the PreparedStatement
> code or in the way the DB handles dates set via prepared stmts.
>
> Can anyone verify or comment on this? Any suggestions as to how we
> might fix it, or where I should look? I have no problem trying to
> patch the JDBC code, but I could use a few pointers about where to
> look first...
>
> thanks,
> Christian
>
>
>
> On 7/15/05, Christian Cryder <c.s.cryder@gmail.com> wrote:
>
>> And just a little bit more information. I downloaded the jdbc source,
>> and poked around a little bit to see if I could determine exactly
>> what's going across the wire. I get this...
>>
>> FE=> Bind(stmt=null,portal=null,$1=<2005-04-03 00:06:02.000000-0700>)
>> FE=> Bind(stmt=null,portal=null,$1=<2005-04-03 02:29:43.000000-0700>)
>> FE=> Bind(stmt=null,portal=null,$1=<2005-04-03 03:02:09.000000-0700>)
>>
>> It would appear to me from this that the data is going out of the
>> JDBC
>> drivers correctly, and that if the dates are getting modified (which
>> they are), it's Postgres that's doing it. Can anyone confirm,
>> deny, or
>> correct my thinking here?
>>
>> tia,
>> Christian
>>
>>
>>
>> On 7/15/05, Christian Cryder <c.s.cryder@gmail.com> wrote:
>>
>>> And just in case that example wasn't clear enough, I've tried using
>>> rs.getTimestamp(i) or rs.getTimestamp(i, cal) instead of
>>> rs.getObject(i). Neither of those have any effect.
>>>
>>> The heart of the problem here seems to be that the millis value is
>>> really getting changed on the way to the DB...
>>>
>>> inserting: 2005-04-03 00:06:02.000 (millis: 1112511962000)
>>> inserting: 2005-04-03 02:29:43.000 (millis: 1112520583000)
>>> inserting: 2005-04-03 03:02:09.000 (millis: 1112522529000)
>>> [UID]:16 [TrxTime]:2005-04-03 00:06:02.000 (millis: 1112511962000)
>>> [UID]:17 [TrxTime]:2005-04-03 03:29:43.000 (millis: 1112524183000)
>>> [UID]:18 [TrxTime]:2005-04-03 04:02:09.000 (millis: 1112526129000)
>>>
>>> So I write one thing and get something different back out. That
>>> doesn't seem correct. Surely there is a way to tell Postgres "to
>>> mess
>>> with my data" when you insert it?
>>>
>>> Christian
>>>
>>>
>>>
>>> On 7/15/05, Christian Cryder <c.s.cryder@gmail.com> wrote:
>>>
>>>> Ok, I think I've got a piece of code that dupes my problem:
>>>>
>>>> Here's how I'm creating my table (doesn't seem to matter whether
>>>> I use
>>>> 'with time zone' or not)...
>>>> CREATE TABLE Foo (
>>>>     UID            SERIAL,
>>>>     TrxTime        timestamp without time zone NOT NULL
>>>>     , PRIMARY KEY (UID)
>>>> );
>>>>
>>>> And here's the code that illustrates the problem...
>>>>     //change our timezone so that we are not operating in DST
>>>> (this allows us to
>>>>     //get un-munged timestamp values from src db)
>>>>     TimeZone curTz = TimeZone.getDefault();
>>>>     TimeZone.setDefault(new SimpleTimeZone(curTz.getRawOffset(),
>>>> curTz.getID()));
>>>>     System.out.println("current tz:"+TimeZone.getDefault());
>>>>
>>>>     //now we're going to write some sample data
>>>>     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd
>>>> HH:mm:ss.SSS");
>>>>     ObjectRepository or = ObjectRepository.getGlobalRepository();
>>>>     DataSource ds = (DataSource) or.getState
>>>> (AppKeys.DB_SYNC_TARGET);
>>>>     Connection conn = null;
>>>>     Statement stmt = null;
>>>>     PreparedStatement pstmt = null;
>>>>     Timestamp t = null;
>>>>     try {
>>>>         conn = ds.getConnection();
>>>>         stmt = conn.createStatement();
>>>>
>>>>         //clean up the table
>>>>         stmt.execute("DELETE FROM Foo");
>>>>
>>>>         //insert some sample data
>>>>         pstmt = conn.prepareStatement("INSERT INTO Foo (TrxTime)
>>>> VALUES (?)");
>>>>         t = new Timestamp(1112511962000L);        //2005-04-03
>>>> 00:06:02
>>>>         System.out.println("inserting: "+sdf.format(t));
>>>>         pstmt.setObject(1, t);
>>>>         pstmt.executeUpdate();
>>>>         t = new Timestamp(1112520583000L);        //2005-04-03
>>>> 02:29:43
>>>>         System.out.println("inserting: "+sdf.format(t));
>>>>         pstmt.setObject(1, t);
>>>>         pstmt.executeUpdate();
>>>>         t = new Timestamp(1112522529000L);        //2005-04-03
>>>> 03:02:09
>>>>         System.out.println("inserting: "+sdf.format(t));
>>>>         pstmt.setObject(1, t);
>>>>         pstmt.executeUpdate();
>>>>         if (!conn.getAutoCommit()) conn.commit();
>>>>
>>>>         //now read the values back out
>>>>         ResultSet rs = stmt.executeQuery("SELECT * FROM Foo");
>>>>         while (rs.next()) {
>>>>             System.out.println("[UID]:"+rs.getObject(1)+"
>>>> [TrxTime]:"+rs.getObject(2));
>>>>         }
>>>>         rs.close();
>>>>     } catch (SQLException e) {
>>>>         System.out.println("Unexpected SQLException: "+e);
>>>>         e.printStackTrace();
>>>>
>>>>     } finally {
>>>>         if (stmt!=null) try {stmt.close();} catch (SQLException
>>>> e) {}
>>>>         if (pstmt!=null) try {pstmt.close();} catch
>>>> (SQLException e) {}
>>>>         if (conn!=null) try {conn.close();} catch (SQLException
>>>> e) {}
>>>>     }
>>>>
>>>> Note that I am running in MST as my default system setting. I
>>>> modify
>>>> this at runtime so that I am NOT using daylight savings. Here's
>>>> what I
>>>> get for output:
>>>>
>>>> inserting: 2005-04-03 00:06:02.000
>>>> inserting: 2005-04-03 02:29:43.000
>>>> inserting: 2005-04-03 03:02:09.000
>>>>
>>>> [UID]:7 [TrxTime]:2005-04-03 00:06:02.0
>>>> [UID]:8 [TrxTime]:2005-04-03 03:29:43.0
>>>> [UID]:9 [TrxTime]:2005-04-03 04:02:09.0
>>>>
>>>> See how the data is getting changed when its written into the DB
>>>> (the
>>>> last 2 timestamps are bumped by an hour). Manually querying the DB
>>>> confirms that it got written in wrong
>>>>
>>>> What appears to be happening is that either the JDBC driver or
>>>> Postgres itself is munging the data on the way in, saying - "since
>>>> Postgres is running in MST w/ DST, I'd better adjust these
>>>> times". And
>>>> that's what I'm trying to avoid - I want it to write exactly what I
>>>> put in, with no adjustments.
>>>>
>>>> Any suggestions?
>>>>
>>>> tia,
>>>> Christian
>>>>
>>>>
>>>>
>>>> On 7/15/05, Dave Cramer <pg@fastcrypt.com> wrote:
>>>>
>>>>> Christian,
>>>>>
>>>>> Can you send me a snippet of code that shows me what you are
>>>>> trying
>>>>> to do ?
>>>>>
>>>>> Dave
>>>>> On 14-Jul-05, at 3:25 PM, Christian Cryder wrote:
>>>>>
>>>>>
>>>>>> On 7/14/05, Dave Cramer <pg@fastcrypt.com> wrote:
>>>>>>
>>>>>>
>>>>>>> Yeah, create your timestamps without timezones and they will
>>>>>>> not be
>>>>>>> converted.
>>>>>>>
>>>>>>>
>>>>>>
>>>>>> Dave, how exactly do you do this? Especially if I am trying to
>>>>>> read a
>>>>>> date out of the db (there is no timezone info there, but by
>>>>>> the time I
>>>>>> access the data via ps.getDate() its already there).
>>>>>>
>>>>>> Any suggestions would be greatly appreciated.
>>>>>>
>>>>>> Thanks,
>>>>>> Christian
>>>>>>
>>>>>> ---------------------------(end of
>>>>>> broadcast)---------------------------
>>>>>> TIP 6: explain analyze is your friend
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>
>>>
>>
>>
>
> ---------------------------(end of
> broadcast)---------------------------
> TIP 3: Have you checked our extensive FAQ?
>
>                http://www.postgresql.org/docs/faq
>
>


В списке pgsql-jdbc по дате отправления:

Предыдущее
От: "Roberta Campo"
Дата:
Сообщение: PreparedStatement.setXXX
Следующее
От: Dave Cramer
Дата:
Сообщение: Re: PreparedStatement.setXXX