- From: Michael Rys <mrys@microsoft.com>
- Date: Fri, 16 Mar 2007 13:01:45 -0700
- To: Bill Patton <bpatton_temp8345@cogneticsystems.com>, "public-qt-comments@w3.org" <public-qt-comments@w3.org>
XQuery is not DST aware. Best regards Michael > -----Original Message----- > From: public-qt-comments-request@w3.org [mailto:public-qt-comments- > request@w3.org] On Behalf Of Bill Patton > Sent: Friday, March 16, 2007 11:28 AM > To: public-qt-comments@w3.org > Subject: Working with time zones and XQuery > > > Dear Sirs, > > I am currently working on implementing all the date/time data types in > XQuery > and associated F&O functions. This has all been straight forward except > when > I get to time zones. I have read the W3C technical note "Working with > Time > Zones", which points out the distinction between a "time zone offset" and > a > real "time zone" which has a historical schedule for daylight savings > time, > DST. The note points out that comparing zoned with unzoned dateTimes is > problematic. > > The XQuery specs and the XML Schema specs remain strangely silent about > DST > and, according to the the technical note, misuses the term time zone for > time > zone offset. > > I believe that there are two consistent interpretations of the spec: one > where > the spec describes date/time values which use standard time and no DST, > and > one that allows for DST by computing time zone offsets for the date and > time in question. The goal is to have a query where the data does not > change > give the same answer when run in the summer or winter. The > implementation > should also be consistent for some time zone preferably the default time > zone > for the computer running the query. > > XQuery uses the "implicit time zone" from the dynamic context to fill in > missing information during operations involving unzoned date/times. If we > use functions time-zone-by-utc(utc) and time-zone-by-wall(wall), which > return > the time zone offset for a specific dateTime, and we use these in the > places > where the spec calls for the implicit-timezone from the dynamic context, > we > get an implementation that is consistent and allows for DST. In this > model > implicit-timezone() might be defined as time-zone-by-utc(current- > dateTime()). > > Here are some questions I am not clear about that lead me to the > conclusion > that we should really be using a time zone offset function rather than a > timezone offset constant. Please note the questions may reflect a poor > understanding on my part. > > 1) Should the XQuery implicit time zone stored in the dynamic context > reflect daylight savings time, DST? Should the implicit time zone > for a computer on the east coast of the US change from -5:00 hours > in the winter to -4:00 hours in the summer, or should this variation > be handled in some other way? > > 2) Is a dateTime without an explicit time zone supposed to represent > a local dateTime in the time zone of the computer running XQuery? > > 3) Should the date, time, and zone offset fields returned by the > current-dateTime() function reflect wall clock time relative to UTC > time? That is, for a computer on the east coast of the US would we > expect to see times like 2002-07-01T10:00:00-04Z in the summer and > 2002-01-01T10:00:00-05Z in the winter? > > 4) Should adjust-dateTime-to-timezone(current-dateTime(), ()) always > return the wall clock time in the computer room? > > 5) Are the following identities always true for any time zone and any > time of the year? > > timezone-from-dateTime(current-dateTime()) eq implicit-timezone() > adjust-dateTime-to-timezone(current-dateTime()) eq current-dateTime() > > 6) We should always be able to convert from wall time to UTC and > back again. Are the following examples, which adjust wall time to > zoned time, correct for a computer using EST time? > > adjust-dateTime-to-timezone(xs:dateTime("2002-07-01T10:00:00")) > 2002-07-01T10:00:00-04:00 : xs:dateTime > > adjust-dateTime-to-timezone(xs:dateTime("2002-01-01T10:00:00")) > 2002-01-01T10:00:00-05:00 : xs:dateTime > > 7) Are the following examples, which adjust each of the results above to > UTC time, correct? > > adj xs:dayTimeDuration("PT0S")) > 2002-07-01T14:00:00Z : xs:dateTime > > adjust-dateTime-to-timezone(xs:dateTime("2002-01-01T10:00:00-05:00"), > xs:dayTimeDuration("PT0S")) > 2002-01-01T15:00:00Z : xs:dateTime > > 8) Are the following examples, which adjust UTC time to local time, > correct > for a computer running on EST? > > adjust-dateTime-to-timezone(xs:dateTime("2002-07-01T14:00:00Z")) > 2002-07-01T10:00:00-04:00 : xs:dateTime > > adjust-dateTime-to-timezone(xs:dateTime("2002-01-01T15:00:00Z")) > 2002-01-01T10:00:00-05:00 : xs:dateTime > > 9) Are the following examples, which convert the results above to unzoned > time, correct? > > adjust-dateTime-to-timezone(xs:dateTime("2002-07-01T10:00:00-04:00"), > ()) > 2002-07-01T10:00:00 : xs:dateTime > > adjust-dateTime-to-timezone(xs:dateTime("2002-01-01T10:00:00-05:00"), > ()) > 2002-01-01T10:00:00 : xs:dateTime > > 10) When comparing dateTimes without a time zone offset, should we, in > effect, historically correct them to UTC, taking into account the > zone > offset for that particular date and time? If the implicit time zone > changes from summer to winter, some XQuery computations will produce > different results when run in the summer rather than in the winter, > even when the data itself has not changed. Applying the historical > time zone offset corrections eliminates this problem, since it ties > zone offsets to the data rather than the implicit time zone. An > implementation might achieve this type of comparison by simply using > the long utc millisecond times corresponding to dateTime values for > comparison operations. > > Using a correction such as this changes the result of XQTS > K-DatesSubtract-1 which is, > > xs:date("1999-07-19") - xs:date("1969-11-30") eq > xs:dayTimeDuration("P10823D") > > from true to false for a computer running on EST time. This > is because xs:date("1999-07-19") - xs:date("1969-11-30") is > P10822DT23H. One hour is lost in April when the clock is set ahead > to DST. None of the other XQTS tests seem to be affected. > > 11) What does the XQuery spec mean when it says in section 10.2 "Before > comparing or subtracting xs:dateTime values, this local value must > be translated or normalized to UTC"? Does it mean we should make > historical time zone correction? It is my understanding that making > historical corrections only makes sense when all the data originates > in the same local time zone as the computer running the query. > > 12) During the spring when the local time suddenly jumps ahead there is > a one-hour hole in the time continuum between 2 AM and 3 AM EST where > 2:30 AM is forbidden. Even worse, in the fall when the time jumps > from 2:00 AM to 1:00 AM there is a one-hour period where times occur > twice in a day, so there are two 1:30 AM's. I will refer to this > period as the "Twilight Zone". In order to convert 1:30 AM to UTC > during the twilight zone you need to know which 1:30 you are talking > about - the 1:30 EDT or the 1:30 EST which occurs one hour later. > The local time, of course, doesn't have an extra bit to express which > 1:30 AM it represents, so which one should we pick? > > 13) If you naively use the Java GregorianCalendar class to compute the > number of days elapsed since 1 AD, you will be off by 2 days from the > XML Schema algorithm for adding a duration to a dateTime. Setting > the Gregorian/Julian cutover to the smallest negative integer > produces the correct answer. Does this mean that the XQuery dateTime > is based purely on a Gregorian calendar, which is sometimes called > the "Proleptic Gregorian Calendar"? Using XQuery to do dateTime > arithmetic spanning 1582 will give results different from the dates > recorded in history books, which are based on the Julian calendar > for dates before 1582. > > 14) What implementation-specific query context options and settings are > needed to make dateTimes really useful? > > What I find perplexing about all this is that I can calculate times from > 9999 > BC to 9999 AD with 1 millisecond accuracy knowing only the 4yr, 100yr, > 400yr > rule for leap year and get the same answers as the Java GregorianCalendar, > but > I don't know how to get simple wall clock times out of XQuery. Wall clock > time is ubiquitous; most of us carry it strapped to our wrists. > > Please let me know if you have any answers. > > Bill Patton > http://www.cogneticsystems.com
Received on Friday, 16 March 2007 20:01:54 UTC