<i18n dev> TimeZone API for getting raw offset and daylight saving amount

Masayoshi Okutsu Masayoshi.Okutsu at Sun.COM
Wed Aug 13 19:05:39 PDT 2008


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)



More information about the i18n-dev mailing list