> > 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