[tz] OpenJDK/CLDR/ICU/Joda issues with Ireland change

Yoshito Umaoka yoshito_umaoka at us.ibm.com
Sat Jan 27 00:10:43 UTC 2018


> > The new version v2018c is only good for OpenJDK when handling Ireland 
> > now in year 2018. 
> 
> Yes, this is a known issue with CLDR, discussed here:
> 
> https://urldefense.proofpoint.com/v2/url?
> 
u=https-3A__mm.icann.org_pipermail_tz_2018-2DJanuary_025974.html&d=DwICaQ&c=jf_iaSHvJObTbx-
> 
siA1ZOg&r=sE8ucIDOUlZUTL1mVdiOnoXkknyh5kabG5yfwpgfi10&m=RgeB4ArWFe2W4Qo489WjPusbCh0yqUEkcYac204zDSA&s=m9GGwtksBqM_tnPSgu6QD8CC5eLjL_2JUUDfJc-
> IlFA&e=
> 
> which says that CLDR doesn't worry about timestamps before 1990.
> 

Well, above statement is not accurate.
CLDR does not provide any zone names only used before 1990.
If name is not available, CLDR specification (LDML) suggests CLDR data 
consumers to use UTC offset format as the fallback.

So, program utilizing CLDR data should still produce accurate timestamp, 
but just not using zone name.

OpenJDK situation is slightly different. Basically, OpenJDK retrofit CLDR 
data partially and use the set of current names only. As far as I know, 
JDK does not support multiple sets of names for a single tz database zone.

For example, America/Indiana/Knox:

====
# Zone  NAME            GMTOFF  RULES   FORMAT  [UNTIL]
Zone America/Indiana/Knox -5:46:30 -    LMT     1883 Nov 18 12:13:30
                        -6:00   US      C%sT    1947
                        -6:00   Starke  C%sT    1962 Apr 29  2:00
                        -5:00   -       EST     1963 Oct 27  2:00
                        -6:00   US      C%sT    1991 Oct 27  2:00
                        -5:00   -       EST     2006 Apr  2  2:00
                        -6:00   US      C%sT
====

With Java, formatting date on Jan 1 2000 and 2010, format date should be 
in EST, while latter date is in CST. However, my understanding is that 
Java only use the current name set (in this case, US Central Time), Java 
date formatter prints out "Central Standard Time" for both date.


Example 1 (TimeZone and DateFormat):

    TimeZone tzKnox = TimeZone.getTimeZone("America/Indiana/Knox");
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTimeZone(tzKnox);

    DateFormat fmt = DateFormat.getDateTimeInstance(DateFormat.FULL, 
DateFormat.FULL, Locale.US);
    fmt.setTimeZone(tzKnox);

    cal.clear();
    cal.set(2000, Calendar.JANUARY, 1);
    String dstr2000 = fmt.format(cal.getTime());

    cal.set(2010, Calendar.JANUARY, 1);
    String dstr2010 = fmt.format(cal.getTime());

    System.out.println(dstr2000);
    System.out.println(dstr2010);

Example 2 (java.time):

    ZoneId tzKnox = ZoneId.of("America/Indiana/Knox");
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEEE, MMMM 
d, y 'at' h:mm:ss a zzzz").withZone(tzKnox);

    ZonedDateTime d2000 = ZonedDateTime.of(2000, 1, 1, 0, 0, 0, 0, 
tzKnox);
    String dstr2000 = d2000.format(formatter);

    ZonedDateTime d2010 = ZonedDateTime.of(2010, 1, 1, 0, 0, 0, 0, 
tzKnox);
    String dstr2010 = d2010.format(formatter);

    System.out.println(dstr2000);
    System.out.println(dstr2010);

Both example prints out:

    Saturday, January 1, 2000 at 12:00:00 AM Central Standard Time
    Friday, January 1, 2010 at 12:00:00 AM Central Standard Time

Although, the date on Jan 1, 2000 should be

    Saturday, January 1, 2000 at 12:00:00 AM Eastern Standard Time


-Yoshito




-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mm.icann.org/pipermail/tz/attachments/20180126/696b4d9a/attachment-0001.html>


More information about the tz mailing list