Re: Patch for JDBC timestamp problems - Mailing list pgsql-patches

From The Hermit Hacker
Subject Re: Patch for JDBC timestamp problems
Date
Msg-id Pine.BSF.4.31.0101131801240.21628-100000@thelab.hub.org
Whole thread Raw
In response to Re: Patch for JDBC timestamp problems  (Barry Lind <barry@xythos.com>)
List pgsql-patches
Bruce, please pass *any* JDBC related patches by Peter Mount
(peter@retep.org.uk) , unless you've recently become a JDBC expert?  AS
Thomas pointed out, not only did you miss the GMT implications, but you
also missed the threadsafe implications :(

On Sat, 13 Jan 2001, Barry Lind wrote:

> Let me answer the questions Thomas raises:
>
> > I'm confused, as usual. How does forcing the client time zone to GMT fix
> > the problem of mismatching client and server time zones? istm that you
> > still have a problem if the server is not on GMT.
>
> Java has an internal representation for a date the is a long storing
> miliseconds since 1970, similar to unix.  By using a date format object
> you convert this long value into strings that make sense to humans.
> Java also provides a SimpleDateFormat object that can format dates
> according to the standard Gregorian calendar, but java also allows other
> calendars/dateformat objects.  Lets walk through a couple of examples:
>
> Consider a java Date object with the underlying long value
> of979419043128
> Taking a SimpleDateFormat object and formatting this date to a String
> with the format mask of "yyyy-MM-dd hh:mm:ss.SSSzzz" will result in:
> 2001-01-13 20:50:43.128GMT  if the timezone setting for the
> SimpleDateFormat object is GMT
> 2001-01-13 12:50:43.128PST  if the timezone setting is PST
> ...
>
> So back to the original bug, the original code was simply performing a
> Timestamp.toString() which uses the following format mask to format the
> date 'yyyy-MM-dd hh:mm:ss.SSS' (notice no timezone is included in the
> format).  So postgresql assumes the date value is in the DB server
> timezone and essentially appends on that timezone.  So looking further
> at the example:
> DB Server running with EST (GMT-05), jdbc running with PST (GMT-08)
> given the date object above:
> Timestamp.toString() would format it as '2001-01-13 12:50:43.128' the
> server would receive this, see no timezone and assume the value was in
> EST and treat it as '2001-01-13 12:50:43.128-05'  which is not what the
> client intended, and is the incorrect value, so when the client selects
> back the date and converts it to PST it will have '2001-01-13
> 09:50:43.128PST', three hours different than it sent to the server.
>
> So that was the problem, now to the solution.  Java's SimpleDateFormat
> object formats timezone information as either the three letter code
> (i.e. PST) if the format mask has three or fewer z's in it, or as a full
> name (i.e. Pacific Standard Time) if the format mask has four or more
> z's in it.  Whereas the ISO date format expected by postgres is of the
> format +/-XX (i.e. -08 for PST).  So there were two ways to code a
> solution to this, a) figure out how to get from the java timezone object
> the offset from GMT and append on that value for timezone, or b) append
> on a known value (i.e. +00) for timezone, and set the timezone of the
> SimpleDateFormat object to timezone corresponding to it (i.e. GMT).  As
> explained above setting the timezone on the SimpleDateFormat object
> doesn't change the absolute value of the date object, just how it gets
> formated.  So going back to the above example:
>
>   a) would have resulted in formatting the date as '2001-01-13
> 12:50:43.128-08' (if I could have figured out how to implement this
> easily)
>   b) results in formatting the date as '2001-01-13 20:50:43.128+00'
> both a) and b) are simply different formats for the same underlying Date
> value of 979419043128, and both are interpreted by postgresql as the
> same timestamp value.
>
>
> > Does creating a static variable affect the threadsafe capabilities of
> > the driver? If so, it shouldn't be done, but perhaps this is a feature
> > of the code already?
>
> The Java core library objects are supposed to be thread safe unless
> documented otherwise, and since SimpleDateFormat is a core library
> object, it should be safe to use it from multiple threads
> simultaniously.  However, I just looked at the source code for
> SimpleDateFormat and it is clearly *not* thread safe.  So to work around
> this java bug I will resubmit the original patch to take this into
> account.
>
> thanks,
> --Barry
>
> Thomas Lockhart wrote:
> >
> > > Oh, great, I see this patch fixes Mike Cannon's problem too.  I will
> > > apply it to the main tree now, and it will appear in 7.1.  If you have
> > > any more improvements, please send them over.  Thanks.
> >
> > I'm confused, as usual. How does forcing the client time zone to GMT fix
> > the problem of mismatching client and server time zones? istm that you
> > still have a problem if the server is not on GMT.
> >
> > Does creating a static variable affect the threadsafe capabilities of
> > the driver? If so, it shouldn't be done, but perhaps this is a feature
> > of the code already?
> >
> >                       - Thomas
>

Marc G. Fournier                   ICQ#7615664               IRC Nick: Scrappy
Systems Administrator @ hub.org
primary: scrappy@hub.org           secondary: scrappy@{freebsd|postgresql}.org


pgsql-patches by date:

Previous
From: Barry Lind
Date:
Subject: Re: Patch for JDBC timestamp problems
Next
From: Barry Lind
Date:
Subject: Revised Patch for JDBC timestamp problems