提交 4fc161c4 编写于 作者: S sherman

8025971: Remove ZoneId.OLD_SHORT_IDS

8026197: Slow reading tzdb.dat if the JRE is on a high-latency, remote file system
Summary: removed the compatiblity old short-ids mapping
Reviewed-by: okutsu
上级 944d6d25
......@@ -168,51 +168,6 @@ import java.util.TimeZone;
*/
public abstract class ZoneId implements Serializable {
/**
* A map of zone overrides to enable the older short time-zone names to be used.
* <p>
* Use of short zone IDs has been deprecated in {@code java.util.TimeZone}.
* This map allows the IDs to continue to be used via the
* {@link #of(String, Map)} factory method.
* <p>
* This map contains an older mapping of the IDs, where 'EST', 'MST' and 'HST'
* map to IDs which include daylight savings.
* This is in line with versions of TZDB before 2005r.
* <p>
* This maps as follows:
* <ul>
* <li>EST - America/New_York</li>
* <li>MST - America/Denver</li>
* <li>HST - Pacific/Honolulu</li>
* <li>ACT - Australia/Darwin</li>
* <li>AET - Australia/Sydney</li>
* <li>AGT - America/Argentina/Buenos_Aires</li>
* <li>ART - Africa/Cairo</li>
* <li>AST - America/Anchorage</li>
* <li>BET - America/Sao_Paulo</li>
* <li>BST - Asia/Dhaka</li>
* <li>CAT - Africa/Harare</li>
* <li>CNT - America/St_Johns</li>
* <li>CST - America/Chicago</li>
* <li>CTT - Asia/Shanghai</li>
* <li>EAT - Africa/Addis_Ababa</li>
* <li>ECT - Europe/Paris</li>
* <li>IET - America/Indiana/Indianapolis</li>
* <li>IST - Asia/Kolkata</li>
* <li>JST - Asia/Tokyo</li>
* <li>MIT - Pacific/Apia</li>
* <li>NET - Asia/Yerevan</li>
* <li>NST - Pacific/Auckland</li>
* <li>PLT - Asia/Karachi</li>
* <li>PNT - America/Phoenix</li>
* <li>PRT - America/Puerto_Rico</li>
* <li>PST - America/Los_Angeles</li>
* <li>SST - Pacific/Guadalcanal</li>
* <li>VST - Asia/Ho_Chi_Minh</li>
* </ul>
* The map is unmodifiable.
*/
public static final Map<String, String> OLD_SHORT_IDS;
/**
* A map of zone overrides to enable the short time-zone names to be used.
* <p>
......@@ -220,9 +175,9 @@ public abstract class ZoneId implements Serializable {
* This map allows the IDs to continue to be used via the
* {@link #of(String, Map)} factory method.
* <p>
* This map contains a newer mapping of the IDs, where 'EST', 'MST' and 'HST'
* map to IDs which do not include daylight savings
* This is in line with TZDB 2005r and later.
* This map contains a mapping of the IDs that is in line with TZDB 2005r and
* later, where 'EST', 'MST' and 'HST' map to IDs which do not include daylight
* savings.
* <p>
* This maps as follows:
* <ul>
......@@ -259,42 +214,36 @@ public abstract class ZoneId implements Serializable {
*/
public static final Map<String, String> SHORT_IDS;
static {
Map<String, String> base = new HashMap<>();
base.put("ACT", "Australia/Darwin");
base.put("AET", "Australia/Sydney");
base.put("AGT", "America/Argentina/Buenos_Aires");
base.put("ART", "Africa/Cairo");
base.put("AST", "America/Anchorage");
base.put("BET", "America/Sao_Paulo");
base.put("BST", "Asia/Dhaka");
base.put("CAT", "Africa/Harare");
base.put("CNT", "America/St_Johns");
base.put("CST", "America/Chicago");
base.put("CTT", "Asia/Shanghai");
base.put("EAT", "Africa/Addis_Ababa");
base.put("ECT", "Europe/Paris");
base.put("IET", "America/Indiana/Indianapolis");
base.put("IST", "Asia/Kolkata");
base.put("JST", "Asia/Tokyo");
base.put("MIT", "Pacific/Apia");
base.put("NET", "Asia/Yerevan");
base.put("NST", "Pacific/Auckland");
base.put("PLT", "Asia/Karachi");
base.put("PNT", "America/Phoenix");
base.put("PRT", "America/Puerto_Rico");
base.put("PST", "America/Los_Angeles");
base.put("SST", "Pacific/Guadalcanal");
base.put("VST", "Asia/Ho_Chi_Minh");
Map<String, String> pre = new HashMap<>(base);
pre.put("EST", "America/New_York");
pre.put("MST", "America/Denver");
pre.put("HST", "Pacific/Honolulu");
OLD_SHORT_IDS = Collections.unmodifiableMap(pre);
Map<String, String> post = new HashMap<>(base);
post.put("EST", "-05:00");
post.put("MST", "-07:00");
post.put("HST", "-10:00");
SHORT_IDS = Collections.unmodifiableMap(post);
Map<String, String> map = new HashMap<>(64);
map.put("ACT", "Australia/Darwin");
map.put("AET", "Australia/Sydney");
map.put("AGT", "America/Argentina/Buenos_Aires");
map.put("ART", "Africa/Cairo");
map.put("AST", "America/Anchorage");
map.put("BET", "America/Sao_Paulo");
map.put("BST", "Asia/Dhaka");
map.put("CAT", "Africa/Harare");
map.put("CNT", "America/St_Johns");
map.put("CST", "America/Chicago");
map.put("CTT", "Asia/Shanghai");
map.put("EAT", "Africa/Addis_Ababa");
map.put("ECT", "Europe/Paris");
map.put("IET", "America/Indiana/Indianapolis");
map.put("IST", "Asia/Kolkata");
map.put("JST", "Asia/Tokyo");
map.put("MIT", "Pacific/Apia");
map.put("NET", "Asia/Yerevan");
map.put("NST", "Pacific/Auckland");
map.put("PLT", "Asia/Karachi");
map.put("PNT", "America/Phoenix");
map.put("PRT", "America/Puerto_Rico");
map.put("PST", "America/Los_Angeles");
map.put("SST", "Pacific/Guadalcanal");
map.put("VST", "Asia/Ho_Chi_Minh");
map.put("EST", "-05:00");
map.put("MST", "-07:00");
map.put("HST", "-10:00");
SHORT_IDS = Collections.unmodifiableMap(map);
}
/**
* Serialization version.
......@@ -314,7 +263,7 @@ public abstract class ZoneId implements Serializable {
* @throws ZoneRulesException if the converted zone region ID cannot be found
*/
public static ZoneId systemDefault() {
return ZoneId.of(TimeZone.getDefault().getID(), SHORT_IDS);
return TimeZone.getDefault().toZoneId();
}
/**
......
......@@ -62,6 +62,7 @@
package java.time.zone;
import java.io.ByteArrayInputStream;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
......@@ -107,7 +108,8 @@ final class TzdbZoneRulesProvider extends ZoneRulesProvider {
try {
String libDir = System.getProperty("java.home") + File.separator + "lib";
try (DataInputStream dis = new DataInputStream(
new FileInputStream(new File(libDir, "tzdb.dat")))) {
new BufferedInputStream(new FileInputStream(
new File(libDir, "tzdb.dat"))))) {
load(dis);
}
} catch (Exception ex) {
......
......@@ -544,7 +544,16 @@ abstract public class TimeZone implements Serializable, Cloneable {
* @since 1.8
*/
public ZoneId toZoneId() {
return ZoneId.of(getID(), ZoneId.SHORT_IDS);
String id = getID();
if (ZoneInfoFile.useOldMapping() && id.length() == 3) {
if ("EST".equals(id))
return ZoneId.of("America/New_York");
if ("MST".equals(id))
return ZoneId.of("America/Denver");
if ("HST".equals(id))
return ZoneId.of("America/Honolulu");
}
return ZoneId.of(id, ZoneId.SHORT_IDS);
}
private static TimeZone getTimeZone(String ID, boolean fallback) {
......
......@@ -26,6 +26,7 @@
package sun.util.calendar;
import java.io.ByteArrayInputStream;
import java.io.BufferedInputStream;
import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
......@@ -243,7 +244,8 @@ public final class ZoneInfoFile {
try {
String libDir = System.getProperty("java.home") + File.separator + "lib";
try (DataInputStream dis = new DataInputStream(
new FileInputStream(new File(libDir, "tzdb.dat")))) {
new BufferedInputStream(new FileInputStream(
new File(libDir, "tzdb.dat"))))) {
load(dis);
}
} catch (Exception x) {
......@@ -265,6 +267,10 @@ public final class ZoneInfoFile {
}
}
public static boolean useOldMapping() {
return USE_OLDMAPPING;
}
/**
* Loads the rules from a DateInputStream
*
......
......@@ -93,47 +93,6 @@ import org.testng.annotations.Test;
@Test
public class TCKZoneId extends AbstractTCKTest {
//-----------------------------------------------------------------------
// OLD_SHORT_IDS
//-----------------------------------------------------------------------
public void test_constant_OLD_IDS_PRE_2005() {
Map<String, String> ids = ZoneId.OLD_SHORT_IDS;
assertEquals(ids.get("EST"), "America/New_York");
assertEquals(ids.get("MST"), "America/Denver");
assertEquals(ids.get("HST"), "Pacific/Honolulu");
assertEquals(ids.get("ACT"), "Australia/Darwin");
assertEquals(ids.get("AET"), "Australia/Sydney");
assertEquals(ids.get("AGT"), "America/Argentina/Buenos_Aires");
assertEquals(ids.get("ART"), "Africa/Cairo");
assertEquals(ids.get("AST"), "America/Anchorage");
assertEquals(ids.get("BET"), "America/Sao_Paulo");
assertEquals(ids.get("BST"), "Asia/Dhaka");
assertEquals(ids.get("CAT"), "Africa/Harare");
assertEquals(ids.get("CNT"), "America/St_Johns");
assertEquals(ids.get("CST"), "America/Chicago");
assertEquals(ids.get("CTT"), "Asia/Shanghai");
assertEquals(ids.get("EAT"), "Africa/Addis_Ababa");
assertEquals(ids.get("ECT"), "Europe/Paris");
assertEquals(ids.get("IET"), "America/Indiana/Indianapolis");
assertEquals(ids.get("IST"), "Asia/Kolkata");
assertEquals(ids.get("JST"), "Asia/Tokyo");
assertEquals(ids.get("MIT"), "Pacific/Apia");
assertEquals(ids.get("NET"), "Asia/Yerevan");
assertEquals(ids.get("NST"), "Pacific/Auckland");
assertEquals(ids.get("PLT"), "Asia/Karachi");
assertEquals(ids.get("PNT"), "America/Phoenix");
assertEquals(ids.get("PRT"), "America/Puerto_Rico");
assertEquals(ids.get("PST"), "America/Los_Angeles");
assertEquals(ids.get("SST"), "Pacific/Guadalcanal");
assertEquals(ids.get("VST"), "Asia/Ho_Chi_Minh");
}
@Test(expectedExceptions=UnsupportedOperationException.class)
public void test_constant_OLD_IDS_PRE_2005_immutable() {
Map<String, String> ids = ZoneId.OLD_SHORT_IDS;
ids.clear();
}
//-----------------------------------------------------------------------
// SHORT_IDS
//-----------------------------------------------------------------------
......
......@@ -114,14 +114,14 @@ public class JavatimeTest {
zidStr.equals("MST")) {
continue;
}
ZoneId zid = ZoneId.of(zidStr, ZoneId.OLD_SHORT_IDS);
ZoneId zid = ZoneId.of(zidStr, ZoneId.SHORT_IDS);
if (!zid.equals(TimeZone.getTimeZone(zid).toZoneId())) {
throw new RuntimeException("FAILED: zid -> tz -> zid :" + zidStr);
}
TimeZone tz = TimeZone.getTimeZone(zidStr);
// no round-trip for alias and "GMT"
if (!tz.equals(TimeZone.getTimeZone(tz.toZoneId())) &&
!ZoneId.OLD_SHORT_IDS.containsKey(zidStr) &&
!ZoneId.SHORT_IDS.containsKey(zidStr) &&
!zidStr.startsWith("GMT")) {
throw new RuntimeException("FAILED: tz -> zid -> tz :" + zidStr);
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册