- From: Michael Kay <mhk@mhk.me.uk>
- Date: Tue, 30 Mar 2004 14:19:27 +0100
- To: "'Michael Kay'" <mhk@mhk.me.uk>, "'Ashok Malhotra'" <ashokma@microsoft.com>, "'Henry Zongaro'" <zongaro@ca.ibm.com>, <public-qt-comments@w3.org>
This note was rubbish - I forgot which function we were talking about. But something like the following seems to work: (a) Remove the day/hour/minute/second components of both arguments, leaving only a year and a month. Call these (Y1, M1) for the first argument and (Y2, M2) for the second argument (b) If the day/hour/minute/second part of the second argument was greater than the day/hour/minute/second part of the first argument, add one to M2. (c) if (Y1<0) then Y1 := Y1 + 1 if (Y2<0) then Y2 := Y2 + 1 (this is because XML Schema gets negative dates wrong) (d) The answer is the duration x months where x is (12*(Y1-Y2) + M1-M2) (This rule gives the difference between 2004-02-28 and 2004-01-31 as 0 months rather than one month, which feels right to me, though it's a matter of opinion). Michael Kay > -----Original Message----- > From: public-qt-comments-request@w3.org > [mailto:public-qt-comments-request@w3.org] On Behalf Of Michael Kay > Sent: 30 March 2004 08:33 > To: 'Ashok Malhotra'; 'Henry Zongaro'; public-qt-comments@w3.org > Subject: RE: [F&O] IBM-FO-106: > fn:subtract-dateTimes-yielding-yearMonthDuration - "maximum > number of months" is imprecise > > > > Henry: > > I realized after I sent the note that we needed to be more > > precise about > > the wording and we should discuss the details. I'll put it on the > > agenda. > > > > Here is my proposal: > > You start with $arg2 and count towards $arg1. > > Keeping the day and time values constant you increment the > > month value, > > rolling over the year value as needed until adding another > month would > > take you past $arg1. You then convert the months you added into an > > yearMonthDuration. > > > > Make sense? > > > > Your proposed text doesn't explain what happens with negative > durations. > > I actually thought the wording in the Christmas Day draft was > an improvement > over the 12 Nov wording, and was probably OK. > > But here's a more precise approach: > > Firstly, calculate the number of months M1 between the supplied > date/dateTime and the baseline xs:date -0001-01-01 > (equivalent to the ISO > 8601 date 0000-01-01). If the year is positive, this is (12*y > + m-1) where y > and m are the year and month components of the date. If the year is > negative, M1 is the negative number (12*(y+1) + (12-m)). > > Now calculate the number of months M2 in the supplied > duration, as 12*y+m > where y and m are the year and month components of the > duration. (If the > duration is negative, both y and m are negative). > > Finally, add the number of months (M1+M2) to the baseline xs:date > -0001-01-01, using the rules for adding a yearMonthDuration to a date. > > Michael Kay > > >
Received on Tuesday, 30 March 2004 08:19:50 UTC