Re: iso-timestring fix / proposal for saner timezones

Carlos Konstanski <[email protected]>
Newsgroups gmane.lisp.clsql.general
Message-ID <[email protected]>
On Tue, 2 Feb 2010, Nathan Bird wrote:

> Date: Tue, 02 Feb 2010 16:11:51 -0500
> From: Nathan Bird <[email protected]>
> To: [email protected]
> Subject: [CLSQL] iso-timestring fix / proposal for saner timezones
> 
> This is one that we've had problems with and was also reported in the
> survey.
>
> iso-timestring used to output
>      YYYY-MM-DD HH:MM:SS,,UUUUUU
>
> This was an invalid format because there are the two commas and because
> 3 usec would be output as xx,,3 instead of xx.000003.  These invalid
> timestamps were also unparseable by the
> clsql:parse-timestring/parse-iso-8601-time functions.
>
> It now outputs
>      YYYY-MM-DD HH:MM:SS.UUUUUU
> which should be a valid iso8601 timestamp and is parseable by
> parse-timestring et al. Additionally, it does not print the ".UUUUUU"
> part if there are no microseconds; useful for the databases that don't
> support fractional seconds.
>
> Patches that get us this far and a lot of tests to try and show it are
> in the development branch.
>
> The rest of this email documents a bug still present in clsql and offers
> a proposal of how to fix it.
> * clsql:wall-time objects don't carry a timezone.
> * clsql-sys:parse-timestring:
>  * with a timezone - shift by TZ into UTC so we don't have to store the
> timezone information.
>  * w/o a timezone (iso says it should be considered local) are parsed
> directly into wall-time - no timezone shifting
> * Sending to databases
>   * Many databases don't have any timezone info: ODBC, mysql,
> sqlserver, some postgres datatypes.  We send and retrieve timezoneless.
> This pretty much works.
>   * databases' datatypes-with-a-timezone that receive a
> timestring-without-a-timezone (what we currently output) read as local
> in server's timezone; this is iso8601 behavior. When it is printed to
> send back to CLSQL, the DB will add the timezone which clsql reads into
> UTC resulting in a shift every roundtrip.  E.g. I send '2010-02-02' to
> db, server reads, stores, and sends back (correctly) '2010-02-02
> 00:00:00-5' which CLSQL then parses as #<WALL-TIME: 2010-02-02
> 05:00:00.000000>. Through multiple trips loading and saving the data, it
> will walk forward to the next day.
>
>
> We propose adding some zone information to wall-times--or subclass
> 'iso-time'. It is a nullable slot that keeps track of what time zone
> information was present when parsed. Parsing doesn't automatically shift
> timezone to UTC. When printing a wall-time, if it has timezone info, we
> print it in in the standard format, if it doesn't have timezone
> information we print it as a local time which continues current behavior.
>
> We add an explicit function to shift a wall-time's timezone to UTC,
> updating the timezone field to keep track of that. All the math
> functions would probably call that function before doing their own
> operation to ease consistency of operations.
>
> With this dates that are stored in fields with timezone data in the
> database will retain that information and survive round trips. Entering
> new dates from strings without timezone information will rely on setting
> the db server or connection variable to the appropriate timezone. If you
> are sticking those into a timezoneless field it should continue to work
> as before.
>
> -- 
> Nathan Bird
> [email protected]
> http://www.acceleration.net/
> Custom Programming, Design, Hosting, and Broadband.

Thank you for the iso-timestring format fix, and the test of the
material re: timezones sounds great!

Carlos
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.