Bug in Calendar when setting time across daylight-saving boundaries?!

Martin Egholm Nielsen martin@egholm-nielsen.dk
Tue Oct 5 08:36:00 GMT 2004


Hi Bryce,

> I took a quick look at this. On mainline I do not see a problem with 
> day-of-month changing, so I guess this has already been fixed - probably 
> with Mark Wielaard's recent Calendar improvements.
Yes, sorry this was actually only seen on 3.3.3...

> I did see the problem with the hour-of-day being wrong. The problem here 
> is that Calendar.set does not invalidate the DST_OFFSET field even 
> though changing other fields could roll the time over a DST boundary. 
> Thus, computeTime() applies the DST offset to the resulting Date value 
> even if the date is no longer in a DST period.
> This patch below should fix the problem. I haven't yet tested this 
> extensively. Could you submit a mauve regression test, based on your 
> test case?
I haven't look into mauve regression tests at all, so I didn't run your 
patch against it - yet!
However, I tested it back and forth, and it seems to work as is 
supposed, perfect!

The only thing it stumbled across is the (known) bug in SimpleTimeZone 
regarding configuring the dst-start and end-time like:
     SimpleTimeZone stz = new SimpleTimeZone(60 * 60 * 1000, "MyZone",
         Calendar.MARCH, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000,
         Calendar.OCTOBER, -1, Calendar.SUNDAY, 2 * 60 * 60 * 1000);
which will make the day of change the first sunday in both march and 
october instead of the last. However, this should have been fixed in 
cvs, I reckon...

So, with these two bugs fixed, the Calendar works as supposed :o)
When do you think these will make it into a stable branch? 3.4.3 or 4.0.0?

Thanks for your help!
  Martin

>        * java/util/Calendar.java (set): Invalidate DST_OFFSET as setting a
>        calendar field may roll over a DST boundary.
> 
> --- Calendar.java       29 Aug 2004 17:28:09 -0000      1.23
> +++ Calendar.java      4 Oct 2004 22:02:42 -0000
> @@ -651,6 +651,10 @@
>        isSet[HOUR_OF_DAY] = false;
>        break;
>       }
> +   +    // We may have rolled over a DST boundary.
> +    if (field != DST_OFFSET && field != ZONE_OFFSET)
> +      isSet[DST_OFFSET] = false;
>   }



More information about the Java mailing list