- From: Bill Patton <bpatton_temp8345@cogneticsystems.com>
- Date: Fri, 16 Mar 2007 13:28:04 -0500
- To: public-qt-comments@w3.org
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 18:33:28 UTC