Hi Umaoka-san,

Thank you for your proposal. Yes, the TimeZone class has some built-in assumptions which cause many problems. I had been planning to introduce some methods, one of which is very similar to your proposal, mainly for fixing the disambiguation problem during the standard-daylight transitions.

I still want to fix it in JDK7, but I'm not sure if I can have time to do so at this point.

Thanks,
Masayoshi

On 8/13/2008 6:59 AM, Yoshito Umaoka wrote:
Hello all,

I'm experiencing a problem for setting my own TimeZone implementation as system default time zone. After some investigation, I think this problem is caused by the lack of API in java.util.TimeZone.

When TimeZone was introduced in JDK 1.1, it did not support historical GMT offsets/daylight saving time rules. So "raw" offset is always same at anytime. When JDK 1.4 implemented historic rules, APIs were not much changed.

With TimeZone methods, you can get GMT offset at the specified time. You can also see if the specified time is in daylight saving time or not. HOWEVER, you have no way to know "raw" GMT offset and daylight saving amount. This is usually not a problem, because you can still get the GMT offset (raw + dstsaving). The problem shows up when TimeZone is used by Calendar.

Calendar has two fields - ZONE_OFFSET and DST_OFFSET. Calendar implementation obviously needs to get the raw GMT offset and the daylight saving amount for setting these fields. However, there are no such APIs in TimeZone class. Calendar implementation calls my TimeZone subclass's getRawOffset()/getDSTSavings() instead.

getRawOffset() and getDSTSavings() are somewhat broken when the historic rule support was introduced. The raw GMT offset and the daylight saving amount could change time to time. But these APIs do not take any arguments specifying date.

Calendar code calls another method supporting historic raw/dst amount changes when the implementation class of TimeZone is JDK's own private one. I think such API should be added in TimeZone as a public API, so Java users can implement their own TimeZone subclasses which work well with Calendar.

In our project (ICU4J), we added an API below in our TimeZone class -

public void getOffset(long date, boolean local, int[] offsets)

This API returns the raw offset in offsets[0] and the daylight saving amount in offsets[1] at the specified time. I do not think the second argument (specifying whether 'date' is local wall time or GMT) is necessary. I think JDK TimeZone also needs such method to resolve Calendar field calculation problem above. The default implementation would be -

public void getOffset(long date, int[] offsets) {
    if (offsets == null || offsets.length < 2) {
        offsets = new int[2];
    }
    if (inDaylightTime(new Date(date)) {
        offsets[1] = getDSTSavings();
        offsets[0] = getOffset(date) - offsets[1];
    } else {
        offsets[0] = getOffset(date);
        offsets[1] = 0;
    }
}

I propose to add this method in java.util.TimeZone and use it in JDK Calendar implementation. Any opinions?


Yoshito Umaoka (ICU Project)

Reply via email to