Time zone string parsing problem in DateFormat.parse

Description

DateFormat#parse may return incorrect result for a date string with a timezone.
This problem is common in French locale. See the sample code below

--------------------------
public static void main(String[] args) {
ULocale frFR = new ULocale("fr_FR");

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
DateFormatSymbols dfs = new DateFormatSymbols(frFR);
String[][] zoneStrings = dfs.getZoneStrings();
DateFormat df = DateFormat.getTimeInstance(DateFormat.FULL, frFR);

try {
Date d;
String timeBase = "12 h 00 ";
for (int i = 0; i < zoneStrings.length; i++) {
String zid = zoneStrings[i][0];
for (int j = 1; j < zoneStrings[i].length; j++) {
if (zoneStrings[i][j] != null) {
String timeStr = timeBase + zoneStrings[i][j];
ParsePosition pos = new ParsePosition(0);
d = df.parse(timeStr, pos);
if (pos.getIndex() != timeStr.length()) {
System.out.println("\nzid: " + zid);
System.out.println("date str: " + timeStr);
System.out.println("zone(actual): " +
zoneStrings[i][j]);
String parsedTimeZone =
timeStr.substring(timeBase.length(), pos.getIndex());
System.out.println("zone(parsed): " +
parsedTimeZone);
}
}
}
}
}
catch (Exception e) {
e.printStackTrace();
}
}

The output of this code is below -

-------------------------- zid: America/Anchorage
date str: 12 h 00 Heure normale de l’Alaska
zone(actual): Heure normale de l’Alaska
zone(parsed): He

zid: America/Anchorage
date str: 12 h 00 Heure avancée de l’Alaska
zone(actual): Heure avancée de l’Alaska
zone(parsed): He

zid: America/Chicago
date str: 12 h 00 Heure normale du Centre (ÉUA)
zone(actual): Heure normale du Centre (ÉUA)
zone(parsed): He

zid: America/Chicago
date str: 12 h 00 Heure avancée du Centre (ÉUA)
zone(actual): Heure avancée du Centre (ÉUA)
zone(parsed): He

zid: America/Denver
date str: 12 h 00 Heure normale des Rocheuses (ÉUA)
zone(actual): Heure normale des Rocheuses (ÉUA)
zone(parsed): He

zid: America/Denver
date str: 12 h 00 HNR (ÉUA)
zone(actual): HNR (ÉUA)
zone(parsed): HNR

zid: America/Denver
date str: 12 h 00 Heure avancée des Rocheuses (ÉUA)
zone(actual): Heure avancée des Rocheuses (ÉUA)
zone(parsed): He

zid: America/Denver
date str: 12 h 00 HAR (ÉUA)
zone(actual): HAR (ÉUA)
zone(parsed): HAR

zid: America/Edmonton
date str: 12 h 00 Heure normale des Rocheuses
zone(actual): Heure normale des Rocheuses
zone(parsed): He

zid: America/Edmonton
date str: 12 h 00 Heure avancée des Rocheuses
zone(actual): Heure avancée des Rocheuses
zone(parsed): He

zid: America/Halifax
date str: 12 h 00 Heure normale de l’Atlantique
zone(actual): Heure normale de l’Atlantique
zone(parsed): He

zid: America/Halifax
date str: 12 h 00 Heure avancée de l’Atlantique
zone(actual): Heure avancée de l’Atlantique
zone(parsed): He

zid: America/Halifax
date str: 12 h 00 HAA
zone(actual): HAA
zone(parsed): HA

zid: America/Halifax
date str: 12 h 00 Halifax (Canada)
zone(actual): Halifax (Canada)
zone(parsed): Ha

zid: America/Indianapolis
date str: 12 h 00 Heure normale de l’Est (ÉUA)
zone(actual): Heure normale de l’Est (ÉUA)
zone(parsed): He

zid: America/Indianapolis
date str: 12 h 00 HNE (ÉUA)
zone(actual): HNE (ÉUA)
zone(parsed): HNE

zid: America/Indianapolis
date str: 12 h 00 Heure avancée de l’Est (ÉUA)
zone(actual): Heure avancée de l’Est (ÉUA)
zone(parsed): He

zid: America/Indianapolis
date str: 12 h 00 HAE (ÉUA)
zone(actual): HAE (ÉUA)
zone(parsed): HAE

zid: America/Montreal
date str: 12 h 00 Heure normale de l’Est
zone(actual): Heure normale de l’Est
zone(parsed): He

zid: America/Montreal
date str: 12 h 00 Heure avancée de l’Est
zone(actual): Heure avancée de l’Est
zone(parsed): He

zid: America/Montreal
date str: 12 h 00 Heure de l’Est
zone(actual): Heure de l’Est
zone(parsed): He

zid: America/New_York
date str: 12 h 00 Heure normale de l’Est (ÉUA)
zone(actual): Heure normale de l’Est (ÉUA)
zone(parsed): He

zid: America/New_York
date str: 12 h 00 HNE (ÉUA)
zone(actual): HNE (ÉUA)
zone(parsed): HNE

zid: America/New_York
date str: 12 h 00 Heure avancée de l’Est (ÉUA)
zone(actual): Heure avancée de l’Est (ÉUA)
zone(parsed): He

zid: America/New_York
date str: 12 h 00 HAE (ÉUA)
zone(actual): HAE (ÉUA)
zone(parsed): HAE

zid: America/Phoenix
date str: 12 h 00 Heure normale des Rocheuses (ÉUA)
zone(actual): Heure normale des Rocheuses (ÉUA)
zone(parsed): He

zid: America/Phoenix
date str: 12 h 00 HNR (ÉUA)
zone(actual): HNR (ÉUA)
zone(parsed): HNR

zid: America/Phoenix
date str: 12 h 00 Heure avancée des Rocheuses (ÉUA)
zone(actual): Heure avancée des Rocheuses (ÉUA)
zone(parsed): He

zid: America/Phoenix
date str: 12 h 00 HAR (ÉUA)
zone(actual): HAR (ÉUA)
zone(parsed): HAR

zid: America/St_Johns
date str: 12 h 00 Heure normale de Terre-Neuve
zone(actual): Heure normale de Terre-Neuve
zone(parsed): He

zid: America/St_Johns
date str: 12 h 00 Heure avancée de Terre-Neuve
zone(actual): Heure avancée de Terre-Neuve
zone(parsed): He

zid: America/St_Johns
date str: 12 h 00 HAT
zone(actual): HAT
zone(parsed): HA

zid: America/Vancouver
date str: 12 h 00 Heure normale du Pacifique
zone(actual): Heure normale du Pacifique
zone(parsed): He

zid: America/Vancouver
date str: 12 h 00 Heure avancée du Pacifique
zone(actual): Heure avancée du Pacifique
zone(parsed): He

zid: America/Vancouver
date str: 12 h 00 HAP
zone(actual): HAP
zone(parsed): HA

zid: America/Winnipeg
date str: 12 h 00 Heure normale du Centre
zone(actual): Heure normale du Centre
zone(parsed): He

zid: America/Winnipeg
date str: 12 h 00 Heure avancée du Centre
zone(actual): Heure avancée du Centre
zone(parsed): He

zid: America/Winnipeg
date str: 12 h 00 HAC
zone(actual): HAC
zone(parsed): HA

zid: Asia/Jerusalem
date str: 12 h 00 Heure normale d’Israël
zone(actual): Heure normale d’Israël
zone(parsed): He

zid: Asia/Jerusalem
date str: 12 h 00 Heure avancée d’Israël
zone(actual): Heure avancée d’Israël
zone(parsed): He

zid: Asia/Jerusalem
date str: 12 h 00 HAI
zone(actual): HAI
zone(parsed): HA

zid: Asia/Shanghai
date str: 12 h 00 Heure normale de Chine
zone(actual): Heure normale de Chine
zone(parsed): He

zid: Asia/Shanghai
date str: 12 h 00 Heure avancée de Chine
zone(actual): Heure avancée de Chine
zone(parsed): He

zid: Asia/Shanghai
date str: 12 h 00 HAC
zone(actual): HAC
zone(parsed): HA

zid: Asia/Tokyo
date str: 12 h 00 Heure normale du Japon
zone(actual): Heure normale du Japon
zone(parsed): He

zid: Asia/Tokyo
date str: 12 h 00 Heure avancée du Japon
zone(actual): Heure avancée du Japon
zone(parsed): He

zid: Europe/Bucharest
date str: 12 h 00 Heure normale de l’Europe de l’Est
zone(actual): Heure normale de l’Europe de l’Est
zone(parsed): He

zid: Europe/Bucharest
date str: 12 h 00 HEE
zone(actual): HEE
zone(parsed): HE

zid: Europe/Bucharest
date str: 12 h 00 Heure avancée de l’Europe de l’Est
zone(actual): Heure avancée de l’Europe de l’Est
zone(parsed): He

zid: Europe/Bucharest
date str: 12 h 00 HAEE
zone(actual): HAEE
zone(parsed): HAE

zid: Europe/Paris
date str: 12 h 00 Heure normale de l’Europe centrale
zone(actual): Heure normale de l’Europe centrale
zone(parsed): He

zid: Europe/Paris
date str: 12 h 00 HNEC
zone(actual): HNEC
zone(parsed): HNE

zid: Europe/Paris
date str: 12 h 00 Heure avancée de l’Europe centrale
zone(actual): Heure avancée de l’Europe centrale
zone(parsed): He

zid: Europe/Paris
date str: 12 h 00 HAEC
zone(actual): HAEC
zone(parsed): HAE
--------------------------
This problem is caused by the logic used for timezone name lookup. These
timezone names are once stored in a HashMap and timezone name parser code check
these names one by one. When a "starts with" match is found, the look up code
stop then return the result. In French locale, a timezone name "HE" is used for
America/Montreal. Thus, timezone name start with "Heure..." stored in the
HashMap after "HE" will never match.

Activity

Show:
TracBot
June 30, 2018, 11:41 PM
Trac Comment by auditor—1970-01-01T01:27:05.000Z
  • Wed Aug 2 07:27:46 2006 yoshito moved from incoming to formatting

  • Wed Aug 2 13:30:40 2006 yoshito changed notes2: target: "UNSCH" to "3.4.5",

  • Wed Aug 2 23:14:20 2006 yoshito changed notes2: review: "" to "eric, ram", weeks: "" to "0.25",

  • Wed Aug 2 23:16:30 2006 yoshito changed notes2: xref: "" to "5291",

  • Mon Aug 7 11:21:08 2006 emader moved from formatting to fixed

  • Tue Sep 19 13:54:12 2006 yoshito changed notes2: xref: "5291" to "5291,5392",

  • Sun Oct 22 07:42:36 2006 grhoten moved from fixed to closed

TracBot
June 30, 2018, 11:41 PM
Trac Comment 2 by anonymous—2009-09-28T09:36:43.000Z

[восточные танцы видео|http://art-dance.com.ua/]

Fixed

Assignee

Yoshito Umaoka

Reporter

TracBot

Components

Labels

None

Reviewer

None

Priority

minor

Time Needed

None

Fix versions