Someone was smart and wrote a test to stop us doing this :)

It breaks the compatiblity with SimpleDateFormat.

I still think the real problem here is that we're trying to use a
DateFormat to represent a Duration, and DateFormat's lack the concept
of "ignore leading 0's".

Instead I've added a boolean padWithZeroes parameter to the format
method. So the broken test  code changes from:

        //text = DurationFormatUtils.ISO_EXTENDED_FORMAT.format(cal);

to

        text = DurationFormatUtils.format(cal.getTime().getTime(),
DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN, false);

Ugly, but at least it's now using a duration. 

It also changes the date you pass in. The former didn't work on
milliseconds but had a time of 1 AD. The latter switches to use
milliseconds.

There are still a few problems in here. What used to, with FastDateFormat, be:

P1Y2M3DT10H30M0.0S

is now:

P1Y1M3DT3H30M0.0S

Now, the 10H to 3H difference is probably due to my weakly defined
YEAR/MONTH values.
The 2M to 1M is interesting. One month is the correct answer to my
mind, but it used to think it was 2 months. Looks like this is
actually a bug that's been fixed, so that's a plus.

Lastly, I'd like to go ahead and remove the
DurationFormatUtils.ISO_EXTENDED_FORMAT variable. The PATTERN would
probably be renamed to use this more concise name. It has a plus-point
that it handles years/months better, though still fails to work leaps
out correctly. It's weird to use as you have to use dates in the
mid-roman era.

Hen

On Mon, 13 Sep 2004 11:15:14 -0400, Chua, Jerson (Exchange)
<[EMAIL PROTECTED]> wrote:
> Hen,
> 
> Try this one out.
> 
> Update the code in case 'y' into this
> 
> if (tokenLen == 2) {
>         rule = TwoDigitYearField.INSTANCE;
> } else {
>         rule = selectNumberRule(Calendar.YEAR, tokenLen);
> 
> 
> }
> 
> -----Original Message-----
> From: Henri Yandell [mailto:[EMAIL PROTECTED]
> Sent: Sunday, September 12, 2004 12:48 AM
> To: Jakarta Commons Developers List
> Subject: Re: Time bugs Was: [lang] FastDateFormat year bug
> 
> Actually, I retract this. If it switches to P'y'Y, then it won't print
> out 2002 but 02 when it does large durations. I think the 'hack' of
> using a DateFormat to format durations is stretched here.
> 
> So 2 problems now. Years are broke in ISO_EXTENDED and dates are broke
> in FastDateFormat.
> 
> Hen
> 
> On Sun, 12 Sep 2004 00:40:51 -0400, Henri Yandell <[EMAIL PROTECTED]>
> wrote:
> 
> > testISODurationFormat:
> >         // test fixture from example in
> > http://www.w3.org/TR/xmlschema-2/#duration
> >         cal.set(1, 1, 3, 10, 30, 0);
> >         cal.set(Calendar.MILLISECOND, 0);
> >         text = DurationFormatUtils.ISO_EXTENDED_FORMAT.format(cal);
> >         assertEquals("P1Y2M3DT10H30M0.0S", text);
> >
> > This is, I believe, a bug in our pattern:
> >
> > ISO_EXTENDED_FORMAT_PATTERN = "'P'yyyy'Y'M'M'd'DT'H'H'm'M's.S'S'"
> >
> > should be:
> >
> > ISO_EXTENDED_FORMAT_PATTERN = "'P'y'Y'M'M'd'DT'H'H'm'M's.S'S'"
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
> 
> 
> 
> ***********************************************************************
> Bear Stearns is not responsible for any recommendation, solicitation,
> offer or agreement or any information about any transaction, customer
> account or account activity contained in this communication.
> ***********************************************************************
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to