6645292: [Fmt-Da] Timezone Western Summer Time (Australia) is parsed incorrectly
authorpeytoia
Mon, 08 Sep 2008 13:31:45 +0900
changeset 1312 880799c54c4d
parent 1311 2b1552286d23
child 1313 f9151e9e2f50
6645292: [Fmt-Da] Timezone Western Summer Time (Australia) is parsed incorrectly Reviewed-by: okutsu
jdk/src/share/classes/java/text/SimpleDateFormat.java
jdk/test/java/text/Format/DateFormat/Bug6645292.java
--- 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);
+        }
+    }
+}