6645292: [Fmt-Da] Timezone Western Summer Time (Australia) is parsed incorrectly
Reviewed-by: okutsu
--- a/jdk/src/share/classes/java/text/SimpleDateFormat.java Mon Sep 08 11:49:49 2008 +0900
+++ b/jdk/src/share/classes/java/text/SimpleDateFormat.java Mon Sep 08 13:31:45 2008 +0900
@@ -1482,10 +1482,13 @@
// If the time zone matched uses the same name
// (abbreviation) for both standard and daylight time,
// let the time zone in the Calendar decide which one.
- if (!useSameName) {
+ //
+ // Also if tz.getDSTSaving() returns 0 for DST, use tz to
+ // determine the local time. (6645292)
+ int dstAmount = (nameIndex >= 3) ? tz.getDSTSavings() : 0;
+ if (!(useSameName || (nameIndex >= 3 && dstAmount == 0))) {
calendar.set(Calendar.ZONE_OFFSET, tz.getRawOffset());
- calendar.set(Calendar.DST_OFFSET,
- nameIndex >= 3 ? tz.getDSTSavings() : 0);
+ calendar.set(Calendar.DST_OFFSET, dstAmount);
}
return (start + zoneNames[nameIndex].length());
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/text/Format/DateFormat/Bug6645292.java Mon Sep 08 13:31:45 2008 +0900
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2008 Sun Microsystems, Inc. All Rights Reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 6645292
+ * @summary Make sure to parse a DST time zone name with which the
+ * last DST rule doesn't observe DST.
+ */
+
+import java.text.*;
+import java.util.*;
+import static java.util.Calendar.*;
+
+public class Bug6645292 {
+ public static void main(String[] args) {
+ Locale loc = Locale.getDefault();
+ TimeZone zone = TimeZone.getDefault();
+ try {
+ Locale.setDefault(Locale.US);
+ // Use "Asia/Shanghai" with an old time stamp rather than
+ // "Australia/Perth" because if Perth decides to obserb DST
+ // permanently, that decision will make this test case
+ // useless. There's the same risk with China, though.
+ TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
+ Calendar cal = Calendar.getInstance();
+ cal.clear();
+ cal.set(1986, JUNE, 1);
+ Date d1 = cal.getTime();
+ SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss zzzz");
+ String s = df.format(d1);
+ Date d2 = null;
+ try {
+ d2 = df.parse(s);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ if (!d1.equals(d2)) {
+ throw new RuntimeException("d1 (" + d1 + ") != d2 (" + d2 + ")");
+ }
+ } finally {
+ Locale.setDefault(loc);
+ TimeZone.setDefault(zone);
+ }
+ }
+}